C 结构中指针变量的大小

C 结构中指针变量的大小,c,pointers,structure,sizeof,C,Pointers,Structure,Sizeof,我希望指针的大小在结构中是可变的“*name_pointer”…指针变量的大小始终为4(32位系统架构)。 如果您有64位系统体系结构,则为8。指针变量(32位系统体系结构)的大小始终为4。 如果您有64位系统体系结构,则它是8。要获得指针的大小,请使用 int main() { struct { char *name_pointer; char all[13]; int foo; } record; printf

我希望指针的大小在结构中是可变的“*name_pointer”…

指针变量的大小始终为4(32位系统架构)。
如果您有64位系统体系结构,则为8。

指针变量(32位系统体系结构)的大小始终为4。
如果您有64位系统体系结构,则它是8。

要获得指针的大小,请使用

int main()
{
    struct
    {
        char *name_pointer;
        char all[13];
        int foo;
    } record;

    printf("%d\n",sizeof(record.all));
    printf("%d\n",sizeof(record.foo));
    printf("%d\n",sizeof(record));

    return 0;
}
你可能会得到2、4、6、8等


要获取指针指向的数据大小(a
char
),请使用

你应该得到1


若要获取指针指向的字符串的字符串长度,假设
record.name\u指针
指向合法数据,请使用

printf("%d\n", (int) sizeof(*record.name_pointer));

顺便说一句,正如@alk所说的以及为什么上面的
(int)
转换,一个与
sizeof()一起使用的合适的转换说明符包含了“z”前缀。
sizeof()
strlen()
的结果类型为
size\u t
。虽然
size\u t
int
通常是相同的,但有许多系统的大小不同。由于sizeof()是一种“无符号整数类型”(C116.5.3.4),我建议

printf("%d\n", (int) strlen(record.name_pointer));

要获取指针的大小,请使用

int main()
{
    struct
    {
        char *name_pointer;
        char all[13];
        int foo;
    } record;

    printf("%d\n",sizeof(record.all));
    printf("%d\n",sizeof(record.foo));
    printf("%d\n",sizeof(record));

    return 0;
}
你可能会得到2、4、6、8等


要获取指针指向的数据大小(a
char
),请使用

你应该得到1


若要获取指针指向的字符串的字符串长度,假设
record.name\u指针
指向合法数据,请使用

printf("%d\n", (int) sizeof(*record.name_pointer));

顺便说一句,正如@alk所说的以及为什么上面的
(int)
转换,一个与
sizeof()一起使用的合适的转换说明符包含了“z”前缀。
sizeof()
strlen()
的结果类型为
size\u t
。虽然
size\u t
int
通常是相同的,但有许多系统的大小不同。由于sizeof()是一种“无符号整数类型”(C116.5.3.4),我建议

printf("%d\n", (int) strlen(record.name_pointer));

我认为在sizeof中使用数据类型而不是在本机数据类型中使用变量是一个好主意。因此,请使用:

printf("%zu\n", sizeof(...

我认为在sizeof中使用数据类型而不是在本机数据类型中使用变量是一个好主意。因此,请使用:

printf("%zu\n", sizeof(...

使用以下代码:

sizeof(char *)

使用以下代码:

sizeof(char *)

阅读:了解
name\u指针
all
.sizof(char*)之间的区别;将告诉您sizeof(record.name\u指针);您需要
sizeof(record.name\u指针)
strlen(record.name\u指针)
?是什么阻止了您使用sizeof(record.name\u指针);阅读:了解
name\u指针
all
.sizof(char*)之间的区别;将告诉您sizeof(record.name\u指针);您需要
sizeof(record.name\u指针)
strlen(record.name\u指针)
?是什么阻止了您使用sizeof(record.name\u指针);在您的系统中删除
始终
添加
而不是在64位系统上。那里是8点。还有其他的。。。!在您的系统中删除
始终
添加
而不是在64位系统上。那里是8点。还有其他的。。。!真正地我更喜欢使用变量,所以如果更改变量类型,代码通常保持正确。真的吗?我更喜欢使用变量,因此如果更改变量类型,代码通常保持正确。在第二个变量中,指向的数据是字符串,而不是第一个字符。因此,这是错误的。挑剔:由于
strlen()
返回
size\u t
适当的转换说明符应以适当的长度修饰符
z
作为前缀,成为
zd
@ManojAwasthi:
name\u指针定义为
char*
,因此它只指向一个字符。所以一切都很好。@alk Yes-我同意-想到了这一点,但不确定是否要将这一改进添加到一个基本问题上。@Manoj Awasthi
record.name\u pointer
是指向字符的指针,因此(*record.name\u pointer)的大小将为1。由于C中的字符串是一个可变长度的字符数组,字符串值由第一个
字符的地址传递,无论
记录.name\u指针是否仅用于指向1
字符
,字符串,或者固定字符数组与OP的代码段无法区分。在第二个数组中,指向的数据是字符串,而不是第一个字符。因此,这是错误的。挑剔:由于
strlen()
返回
size\u t
适当的转换说明符应以适当的长度修饰符
z
作为前缀,成为
zd
@ManojAwasthi:
name\u指针定义为
char*
,因此它只指向一个字符。所以一切都很好。@alk Yes-我同意-想到了这一点,但不确定是否要将这一改进添加到一个基本问题上。@Manoj Awasthi
record.name\u pointer
是指向字符的指针,因此(*record.name\u pointer)的大小将为1。由于C中的字符串是一个可变长度的字符数组,字符串值由第一个
字符的地址传递,无论
记录.name\u指针是否仅用于指向1
字符
,字符串,或者固定字符数组与OP的代码片段无法区分。提供解释和有效的解决方案会更有帮助。这不起作用<代码>记录
不是指针,因此不能使用
->
解除对它的引用。另外,为什么要除以4?提供一个解释和一个有效的解决方案会更有帮助。这是行不通的<代码>记录
不是指针,因此不能使用
->
解除对它的引用。另外,为什么要除以4?