2014-10-08 176 views
0

一个非常基本的C问题。为什么以下两个命令会导致创建具有不同大小的字符串?C基础:比较“* char”和“char [x]”创建字符串

如下所示,方法1创建一个大小为8字节的字符串,方法2创建一个大小为5字节的字符串。

很困惑,为什么方法1是创建的大小为8个字节的字符串...

(我已经看到了这些帖子:Difference of sizeof between char* x and char x[]What is the difference between char s[] and char *s?除非我有一个阅读,理解失效,它并没有真正解决方法的原因1创建的大小为8个字节的字符串。据响应,它似乎是方法1,应创造的4个字节大小的指针)

方法1:

char *string = "ABCD"; 

方法2:

char string2[5] = "ABCD"; 

例如,当我运行下面的程序时,我得到如下所示的输出。

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char *string = "ABCD"; 

    printf("Based on \"char *string = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string)); 
    printf("Size of each element of string: %ld\n",sizeof(string[0])); 
    printf("String: %s\n\n", string); 

    char string2[5] = "ABCD\0"; 

    printf("Based on \"char string2[5] = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string2)); 
    printf("Size of each element of string: %ld\n",sizeof(string2[0])); 
    printf("String: %s\n\n", string2); 

    return 0; 
} 

输出上述程序的:

enter image description here

+2

[C中char s \ [\]和char \ * s有什么区别?](http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c) – 2014-10-08 22:54:42

+0

另一个可能的愚蠢:http://stackoverflow.com/questions/15538210/sizeof-a-pointer – 2014-10-08 23:32:20

+0

另外,对于'char string3 [] =“ABCDE”;'(没有声明大小)'sizeof(string3)== 6'(5个字母+ nul) – 2014-10-08 23:53:22

回答

1

这是因为在这一行char *string = "ABCD";您声明字符指针,其大小为8个字节,其中如在此行char string2[5] = "ABCD";您声明一个5字符的数组,因为char是1字节长,而1 * 5 == 5 bytes那么string2的大小将是5字节

+0

这可能是一个简单的问题,但是你能否详细说明为什么指向char的指针的大小比它所指向的类型大8倍(如果考虑ABCD中的四个字符,即排除/ 0,则为2倍)? (我明白为什么'char string2 [5] =“ABCD”'结果的大小为5个字节。) – iceman 2014-10-08 23:00:44

+1

因为指针存储内存地址不是字符,内存地址通常是8个字节 – 2014-10-08 23:03:38

+0

我现在明白了,谢谢。我觉得我很困惑,因为其他线程中的一些响应意味着指针只占用4个字节的内存,这在32位的情况下的确是如此,但对于64位的情况确实如此(我正在运行后者) 。 – iceman 2014-10-08 23:09:43

0

只有一个char s保存一个ASCII值,这是一个非常小的数字范围,所以它们每个只占用1个字节。

char *是一个指向内存地址的指针,这是一个更大的数字范围,因此需要更多的字节来存储它。 32位系统上的指针占用4个字节,而在64位系统上则占用8个字节。

我认为你在64位系统上运行?我认为这就是8字节的原因。

0

在第一个示例中,您声明了一个变量,该变量是指向char的指针。所以,当你的尺寸为sizeof时,你会得到指针的大小(不是它所指向的大小),它在64位平台上是8个字节。

在第二个示例中,您声明了一个变量,该变量是一个数组char。在C中,sizeof数组的操作与您所期望的相同 - 它返回数组的大小(以字节为单位),在本例中为5 * sizeof(char)(因为您声明了5个字符的数组),即5(自sizeof(char) = 1起)。

在任何一种情况下,使用sizeof通常都不是测量字符串长度的正确方法 - 您应该使用strlen来代替。这将正确处理字符串结束符NUL出现在char数组末尾以外的情况。