我正在读C课程(这是荷兰语,所以可能你不会知道)并且有一个小练习来理解字符串行为.因此我创建了一个小的C程序来开始练习,但我的程序的第一个输出(对我来说)已经令人惊讶.
我的C程序的来源:
#include <string.h>
#include <stdio.h>
void printString(char *string)
{
printf("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n");
printf("%c ",string[0]);
printf("%c ",string[1]);
printf("%c ",string[2]);
printf("%c ",string[3]);
printf("%c ",string[4]);
printf("%c ",string[5]);
printf("%c ",string[6]);
printf("%c ",string[7]);
printf("%c ",string[8]);
printf("%c ",string[9]);
printf("%c ",string[10]);
printf("%c ",string[11]);
printf("%c ",string[12]);
printf("%c ",string[13]);
printf("%c ",string[14]);
printf("%c ",string[15]);
printf("%c ",string[16]);
printf("%d ",string[17]);
printf("%d ",string[18]);
printf("%d\n",string[19]);
}
void main(){
char str[20];
strcpy(str,"Dag grootmoeder!");
printString(str);
}
Run Code Online (Sandbox Code Playgroud)
我用gcc编译(没有特殊的开关)并且多次运行程序:(对于会说英语的人Dag grootmoeder! == Hi grandma!)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 94 -90 111
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 51 -12 96
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! -17 -117 28
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 96 15 -28
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! -20 -46 -18
$./oefString
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
D a g g r o o t m o e d e r ! 68 -75 58
Run Code Online (Sandbox Code Playgroud)
这是一个问题:
1)为什么我得到str的最后3个索引的垃圾值?起初我也printf()正在使用它们%c并注意到字符发生了变化,这就是我%d之后使用它来显示整数值的原因.
2)为什么这些值会发生变化?我什么也没做,然后使用strcpy()str 复制相同的字符串.
感谢您花时间阅读,甚至更多的回复者!
乔恩
你只是在字符串结尾处访问内存.你没有填写它,所以你可以在那里找到任何东西 - 所以这就是为什么在每次运行中你都能找到别的东西.
在C中,"字符串"实际上是0终止的数组(或指向内存的指针).所以,如果你使用打印的字符"%d",你会发现非常最后一个元素,之后!是0.
如果您希望它是可预测的,您可以在使用之前初始化字符串:
memset(str, 0, sizeof(str));
Run Code Online (Sandbox Code Playgroud)
要么
char str[20] = {0,};
Run Code Online (Sandbox Code Playgroud)
作为旁注,它int main不是void main.