使用C中的指针表示法初始化字符串(需要澄清)

时间:2016-09-05 12:25:55

标签: c arrays pointers

我正在尝试使用指针表示法创建一个字符串。我尝试了两种变体,给了我不同的结果。

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工作正常。究竟是怎么回事?

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将是一个自动指针变量。它将具有不确定的价值。如果该值可以作为您的地址空间中的内存地址进行解释,则可以将值分配给该位置的内存,而不会有任何抱怨;但是,你可以覆盖任何有效值,覆盖返回地址,它可能导致任何类型的错误,甚至是你不知道的错误(“它似乎工作”)。

这称为“未定义行为”。

相关问题