我正在尝试使用指针表示法创建一个字符串。我尝试了两种变体,给了我不同的结果。
int main(void){
char * name; // Compiler assigns this to NULL by default
// Scenario 1
// This results in a seg fault since I'm trying to store a value at a NULL location
//name[0] = 'a';
//name[1] = '\x00';
// Scenario 2
// Using a loop to assign values
printf("No of Chars: ");
int count;
scanf("%d", &count);
for (int index = 0; index < count; index++)
name[index] = index + 48;
name[count] = '\x00';
puts(name);
return 0;
}
场景2工作正常。究竟是怎么回事?
答案 0 :(得分:1)
由于undefined behavior,似乎“非常好”。
在您的第二个代码段也
name[index] = index + 48;
是尝试访问无效内存,导致UB。一旦程序成为UB,任何事情都可能发生,包括通常预期的行为。
那说,关于你的评论,
int main(void){
char * name; // Compiler assigns this to NULL by default
错了。 name
是一个自动局部变量,根据C11
,章节
§6.7.9
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。 [...]
并且,关于您在问题标题中使用的措辞
使用指针表示法[...]
初始化字符串
在这里毫无意义。你不是初始化任何东西,你基本上分配值。
答案 1 :(得分:-2)
char * name;
name
将是一个自动指针变量。它将具有不确定的价值。如果该值可以作为您的地址空间中的内存地址进行解释,则可以将值分配给该位置的内存,而不会有任何抱怨;但是,你可以覆盖任何有效值,覆盖返回地址,它可能导致任何类型的错误,甚至是你不知道的错误(“它似乎工作”)。
这称为“未定义行为”。