为什么char*str=";“任何事”;总是8号的吗?
我用为什么char*str=";“任何事”;总是8号的吗?,c,arrays,string,char,byte,C,Arrays,String,Char,Byte,我用sprintf进行了一些测试,将int转换成字符串/字符,并注意到: 当我像这样做一个字符串时 char*str=“任何东西” 无论我在其中写什么,sizeof总是返回一个8字节的值。 但据我所知,char通常是1字节的大小,那么为什么字符串/数组中的字符数不改变其大小呢 如果我写 charstr[15] 我得到了15个字节的大小,那么,如果我键入,为什么不得到15个字节的大小呢 char *str = "11111111111111\0" 但是8字节的大小 与此类似,如果我键入 char
sprintf
进行了一些测试,将int
转换成字符串
/字符
,并注意到:
字符串时
char*str=“任何东西”代码>
无论我在其中写什么,sizeof
总是返回一个8字节的值。
但据我所知,char
通常是1字节的大小,那么为什么字符串/数组中的字符数不改变其大小呢
如果我写
charstr[15]代码>
我得到了15个字节的大小,那么,如果我键入,为什么不得到15个字节的大小呢
char *str = "11111111111111\0"
但是8字节的大小
与此类似,如果我键入
charstr[]={“67”}
sizeof
返回一个3字节的值,这是有意义的,因为它是6、7和\0。
然后我写了这个
int aInt = 368;
sprintf(str, "%d", aInt);
将int aInt 368
转换为字符串并将该字符串写入str
。
这是三个char
,因此,sizeof
应该返回一个4字节的值,计数为\0英寸。
但它仍然返回1,即使我写了3个字符
谁能给我解释一下吗
这是我一直在测试的一段代码:
#include <stdio.h>
int main(int argc, char *arfv[])
{
int aInt = 368;
printf("value of aInt: %d\n", aInt);
char str[15];
//Other ways of creating a string/array which were tested:
//char *str = "anything";
//char str[] = {"67"};
//printf("value of str before: %s\n", str); //value of str before converting
printf("size of str before: %ld\n", sizeof(str)); //size of str before converting
sprintf(str, "%d", aInt); //convert aInt into a string
printf("value of str after: %s\n", str); //value of str after converting
printf("size of str after: %ld\n", sizeof(str)); //size of str after converting
return 0;
}
#包括
int main(int argc,char*arfv[]
{
int=368;
printf(“aInt的值:%d\n”,aInt);
char-str[15];
//创建已测试的字符串/数组的其他方法:
//char*str=“任何东西”;
//字符str[]={“67”};
//printf(“之前的str值:%s\n”,str);//转换之前的str值
printf(“转换前str的大小:%ld\n”,sizeof(str));//转换前str的大小
sprintf(str,“%d”,aInt);//将aInt转换为字符串
printf(“转换后的str值:%s\n”,str);//转换后的str值
printf(“转换后str的大小:%ld\n”,sizeof(str));//转换后str的大小
返回0;
}
Achar*
只是指向某个内存的指针,其大小与您的体系结构上的指针大小相同(8个字节表示64位体系结构,4个字节表示32位体系结构)
由于指针不传递有关其指向的分配大小的信息,sizeof
不会计算分配大小,它只会告诉您指针有多大。此外,请注意,sizeof
是编译时构造;它的值在编译时被完全评估
char *ptr = "1234567890";
char str[10] = "12345";
int numbers[10];
sizeof(ptr)
计算指针的大小。该值通常为4(32位)或8(64位)
sizeof(*ptr)
计算char
的大小。(一)
sizeof(str)
计算数组的大小。(虽然只分配了6个字节,但其大小为10个字节。)
sizeof(number)
将计算为sizeof(int)*10
sizeof
提供存储给定类型的值所需的字节数。对于char*
而言,这通常是4或8个字节。如果您可以找到char
s,则char*
可以存储内存地址。这样一个地址有多少个字符?如果这些char
s编码一个C字符串,那么您可以使用strlen
获取字符串的长度。指针不是数组,而且sizeof
无法读懂您的心思。您在64位处理器上运行,所以内存地址(以及指针对象的大小)是64位。为什么这个问题被否决?OP提出了一个合理的问题,并提供了一个简短的例子来说明他/她所困惑的行为。“achar
通常是1字节的大小”->achar
的大小正好是1,没有例外char
是sizeof
的计量单位。除非适用于VLA。此外,它是一个运算符,因此括号在不应用于类型时是多余的。好的,谢谢澄清。我正在学习的那本书只说明了创建字符串有两种语法,并没有说其中一种是指针。我从来没有听说过它们,我来看看这个主题。关于我问题的第二部分:当我增加数组的大小时,sizeof不会改变它的返回值,而是保持数组创建时的字符数?因为,当我有charstr[]={“67”}
在转换int之前,我删除了sizeof,仅在转换后进行检查,它仍然返回值3。@Merlin不能更改数组的大小。你能在你认为你正在调整代码大小的地方粘贴一些代码吗?这样我就可以解释你实际上在做什么了。@Deduplicator paren在语法不需要的地方是多余的。空白也是如此。这并不意味着我们不使用它们来提高可读性。