初始化char类型的数组

mat*_*eek 2 c arrays pointers char

我想初始化任意大字符串.它是以null结尾的字符串,但我无法打印其内容.谁能告诉我为什么?

char* b;
char c;
b = &c;
*b = 'm';
*(b+1) = 'o';
*(b+2) = 'j';
*(b+3) = 'a';
*(b+4) = '\0';
printf("%s\n", *b);
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 10

您的解决方案调用未定义的行为,因为*(b+1)等等超出了堆栈变量的范围c.因此,当你写信给他们的时候,你写的是你不拥有的内存,这会导致各种各样的腐败.此外,您需要printf("%s\n", b)(printf期望指针%s).

解决方案取决于您想要做什么.您可以初始化指向字符串文字的指针:

const char *str1 = "moja";
Run Code Online (Sandbox Code Playgroud)

您可以初始化一个字符数组:

char str2[] = "moja";
Run Code Online (Sandbox Code Playgroud)

这也可以写成:

char str2[] = { 'm', 'o', 'j', 'a', '\0' };
Run Code Online (Sandbox Code Playgroud)

或者您可以手动分配字符串的值:

char *str3 = malloc(5);
str3[0] = 'm';
str3[1] = 'o';
str3[2] = 'j';
str3[3] = 'a';
str3[4] = '\0';

...

free(str3);
Run Code Online (Sandbox Code Playgroud)

  • 并且printf需要一个带有%s的指针,因此它应该是b,而不是*b.你也可以解释他为什么拿一个字符的地址并写一个字符串开始到那个内存位置是坏 - 坏 - 坏:) (2认同)