c - C 中各种字符串初始化的大小差异

标签 c arrays string pointers sizeof

我开始学习 C 语言,并遇到了一个找不到答案的问题。

当我初始化一个随机字符串时

char *str1 = "Big";
printf("size of str1: %ld\n", sizeof(str1));

当我执行 sizeof(str1) 时,它给我的大小是 8(字节) ,这对我来说没有意义。

当我初始化一个随机字符串时

char str2[] = "Big";
printf("size of str2: %ld\n", sizeof(str2));

当我执行 sizeof(str2) 时,它给我的大小为 4(字节) ,这对我来说有意义,因为三个字符 'B' , 'i' , 'g' ,和'\0' .

为什么第一个给我的是 8 号?

最佳答案

首先,当在指针上使用 sizeof 时,它会给出数据类型的大小,即指针本身,而不是数据类型的大小。 >分配或指向的内存位置。

所以,如果出现

char *str1 = "Big";

sizeof(str1) 将为您提供 str1 本身的大小,即 char * 的大小。这将根据您使用的平台和编译器而有所不同,例如,对于 32 位,它将是 4,对于 64 位,它将是 8,通常

那么,

 char str2 = "Big";

无效。如果你的意思是

 char str2[] = "Big";

在这种情况下,str2 是一个数组,由提供的字符串和空终止符初始化。因此,总大小将为 4 * sizeof(char),即 4。

关于c - C 中各种字符串初始化的大小差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34505149/

相关文章:

c - 按升序接受链表中的元素,但显示函数打印最小的数字而不是整个链表

c - Valgrind 链表内存泄漏

arrays - Azure ARM 模板 - 将数组复制到对象数组

php - 组合字符和数字 php

c# - C# 中的 Heredoc 字符串

java - 为什么负号打印在 $ 符号之前?

c - 如何检查某个时间范围内的事件?

c - 如果路径错误,则 execvp() 返回值

php - 更新一列中的完整数组值

C++ 数组作为参数,编辑 : now includes variable scoping