“ptr”的大小是多少? [关闭]

问题描述 投票:0回答:2
#include<stdio.h>
int main()
{
   char *s[] = {"ice","green","cone","please"};
   char **ptr[] = {s+3,s+2,s+1,s};
   char ***p = ptr;
   
   printf("%s\n",**++p);
   
   printf("%s\n",*--*++p + 3);
   
   printf("%s\n",*p[-2]+3);
   
   printf("%s\n",p[-1][-1] + 1);
   
    
   return 0;
}

我的疑问是ptr会分配多少字节的内存?

一些注意事项:

  1. char **ptr[] ; // ptr 是一个元素数组,它是指向字符数据类型元素的指针。
  2. 所以基本上 ptr 是一个指针数组(它本身就是指针)
  3. 并且由于每个指针都是无符号整型数据类型,因此 ptr 数组的大小应该 =(元素数量 x 指针大小)
  4. 这里没有。元素的数量是 4,我们假设指针的大小(在 64 位系统中)是 8 个字节
  5. 因此 ptr 数组的大小应该是 4*8 = 32;
  6. 如果 ptr 的基址是 6000 那么 ,
  • ptr[0] 的地址 = 6000
  • ptr[1] 的地址 = 6008
  • ptr[2] 的地址 = 6016
  • ptr[3] 的地址 = 6024

为什么在这里提到的答案中将地址设为6000、6001、6002、6003?

请提供相同的清晰度。

arrays c pointers implicit-conversion string-literals
2个回答
0
投票
char **ptr[] = {s+3,s+2,s+1,s};

ptr
是指向 char 的指针的 4 元素数组。

所以它的大小是

4 * sizeof(char **)
,在指针长度为 8 字节的系统上,它将是 32 字节:https://godbolt.org/z/WMcojE858 在指针长度为 4 个字节的 32 位系统上,它将是 16 个字节:https://godbolt.org/z/4Ef4n81xf

并且由于每个指针都是无符号整型数据类型,因此大小 ptr 数组应为 =(元素数量 x 指针大小)

不,它不是整数类型——它是指针类型。

address of ptr[3] = 6024

这个指针是 8 个字节长,所以最后一个字节占用将是 6031,这使得 32 个字节长的指针数组

为什么在这里提到的答案中将地址设为6000、6001、6002, 6003?

我不知道你提到的答案是什么,但指针运算不适用于仅对整个指针类型的字符(在我们的例子中

char **
)。这可能会让你感到困惑

所以

ptr + 1
NOT 一个字节超出
ptr
只有一个
char **
超出
ptr
ptr + 1
&ptr[1]
相同或
*(ptr + 1)
等同于
ptr[1]


-1
投票

变量

ptr
被声明为数组类型

char **ptr[] = {s+3,s+2,s+1,s};

数组的大小等于数组中元素的数量乘以数组元素的大小。

由于上面显示的数组声明中的元素数量没有明确指定,因此它由初始化器的数量决定。在声明的情况下,元素的数量等于

4
.

所以数组的大小等于

4 * sizeof( char ** )
。指针的大小是实现定义的,取决于所使用的系统。它通常可以等于
4
8
.

所以数组的大小等于

16
32
字节。

至于你关于元素地址的问题

ptr[i]
那么如果你将运行这个简单的程序

#include <stdio.h>

int main( void ) 
{
   const char *s[] = {"ice","green","cone","please"};
   const char **ptr[] = {s+3,s+2,s+1,s};
   const char ***p = ptr;

    for ( size_t i = 0; i < 4; i++ )
    {
        printf( "&ptr[%zu] = %p\n", i, ( void * )( ptr + i ) );
    }
}    

那么它的输出可能看起来像

&ptr[0] = 0x7fff8f42d400
&ptr[1] = 0x7fff8f42d408
&ptr[2] = 0x7fff8f42d410
&ptr[3] = 0x7fff8f42d418

对于指针大小等于

8
字节的系统。

至于存储在表达式中的值

ptr[i]
然后它们是实现定义的并指定字符串文字的第一个字符的地址。例如,相等的字符串文字可以存储为一个字符数组或不同的字符数组,具体取决于编译器选项。

如果你有一个声明为 like 的数组,请注意根据指针算法

T a[N];

其中

T
是类型说明符,当相邻元素
&a[i+1] - &a[i]
的地址之间的差异等于
sizeof( T )
.

© www.soinside.com 2019 - 2024. All rights reserved.