c - 使用 char * string 但不使用 char string [11] 时出现段错误

标签 c pointers segmentation-fault

<分区>

Possible Duplicate:
Why do I get a segmentation fault when writing to a string?
Why do I get a segmentation fault when I try to modify a string constant?

我试图运行以下两个代码,但在 file2.cfile1.c 我没有遇到任何错误。有人可以解释以下代码之间的区别吗:

文件1.c

#include <stdio.h>

int main()
{
    int i;
    char  string[11] = {"HelloThere"};
    string[10] = '\0';
    for(i =0;i<5;i++)
    {
        string[i] = 'a';
    }
    printf("%s\n",string);
}

和:

文件2.c

#include <stdio.h>

int main()
{
    int i;
    char * string;
    string = "HelloThere";

    for(i =0;i<5;i++)
    {
        string[i] = 'a';    
    }
    printf("%s",string);

}

最佳答案

这是因为赋值

char  string[11] = {"HelloThere"};

将字符串常量复制到可写内存中,同时

char * string = "HelloThere";

将其留在只读存储器中。虽然写入可写内存绝对没问题(呃!),但写入只读内存是未定义的行为,并且可能会引发崩溃。

请注意,您不需要明确指定字符串的大小,除非您想要分配比字符串文字所需的更多的内存:

char  string[] = {"HelloThere"}; // <<== The size is empty

关于c - 使用 char * string 但不使用 char string [11] 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174659/

相关文章:

c - 这个 reverseBytes 方法是如何工作的?

c - 如何使用 scanf 正确解析和过滤动态输入?

c++ - 在 C++ 的类成员函数中传递当前对象的引用

在 C 中调用 NASM 函数

C:为什么我在一种情况下出现段错误,而在另一种情况下却没有?

c - 为什么 MISRA C 声明指针的副本会导致内存异常?

c - 二维数组中 c 语言的螺旋矩阵

c - 根据我的编译器的说法,我错误地使用了指针来设置二维数组的值。但是,我不确定我到底做错了什么

c++ - 如何在 C++ 中使变量成为未确定的类型?

c++ - 链接 Qwt 库时 Qt 代码中的段错误