指针算术以代码139终止程序(分段错误)

时间:2018-10-15 09:43:35

标签: c pointers segmentation-fault

我写了一个小程序来练习指针算术。如果我运行它,它将以代码139终止,这是一个分段错误。我不知道为什么行

*name1 = *name2;

导致分段错误。这两个变量都在堆栈中,我应该可以在其中访问。

据我所知,应该将name1的第一个字母设置为name2的第一个字母的值。

main.c文件:

#include <stdio.h>

int main()
{
    char* name1;
    char* name2;

    name1 = "Franz";
    name2 = "Otto";

    printf("Vorher:\n");
    printf("Name1: %s\nName2: %s\n", name1, name2);

    *name1 = *name2;

    printf("Nachher:\n");
    printf("Name1: %s\nName2: %s\n", name1, name2);

    return 0;
}

如果要复制它。我已经使用以下Dockerfile运行了它

FROM gcc:8
COPY ./src /usr/src/myapp
WORKDIR /usr/src/myapp
RUN gcc -o myapp main.c
CMD ["./myapp"]

2 个答案:

答案 0 :(得分:3)

您正在尝试修改string literalundefined behaviour。在大多数平台上,尝试修改字符串文字会导致分段错误。

您可能想要这样:

name1 = name2;

代替:

*name1 = *name2;

或更可能您想要这样:

char name1[] = "Franz";
char name2[] = "Otto";

现在name1name2是堆栈中的数组,您可以根据需要对其进行修改。在只有 pointers name1name2出现在堆栈之前,而不是实际的字符串“ Franz”和“ Otto”。

顺便说一句,您的程序中没有指针算术

您应该阅读C课本中有关字符串的章节和有关指针的章节。

答案 1 :(得分:1)

代替这个

*name1 = *name2;

输入:

name1 = name2;

现在,您要重新分配指向名称的指针,而不是实际名称本身。您不能重新分配实际名称,因为它是程序二进制文件的一部分,因此是只读的。

此外,为了反映该事实并防止此类错误,请对此进行更改

char* name1;
char* name2;

const char* name1;
const char* name2;
  

两个变量都在我应该访问的堆栈中。

很好的观察! name1name2确实在堆栈中,您可以随意更改它们,但不能更改*name1*name2