Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么char*str=";“任何事”;总是8号的吗?_C_Arrays_String_Char_Byte - Fatal编程技术网

为什么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;
    }
    
    A
    char*
    只是指向某个内存的指针,其大小与您的体系结构上的指针大小相同(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提出了一个合理的问题,并提供了一个简短的例子来说明他/她所困惑的行为。“a
    char
    通常是1字节的大小”->a
    char
    的大小正好是1,没有例外
    char
    sizeof
    的计量单位。除非适用于VLA。此外,它是一个运算符,因此括号在不应用于类型时是多余的。好的,谢谢澄清。我正在学习的那本书只说明了创建字符串有两种语法,并没有说其中一种是指针。我从来没有听说过它们,我来看看这个主题。关于我问题的第二部分:当我增加数组的大小时,sizeof不会改变它的返回值,而是保持数组创建时的字符数?因为,当我有
    charstr[]={“67”}
    在转换int之前,我删除了sizeof,仅在转换后进行检查,它仍然返回值3。@Merlin不能更改数组的大小。你能在你认为你正在调整代码大小的地方粘贴一些代码吗?这样我就可以解释你实际上在做什么了。@Deduplicator paren在语法不需要的地方是多余的。空白也是如此。这并不意味着我们不使用它们来提高可读性。