我写了一个小程序来练习指针算术。如果我运行它,它将以代码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"]
答案 0 :(得分:3)
您正在尝试修改string literal的undefined behaviour。在大多数平台上,尝试修改字符串文字会导致分段错误。
您可能想要这样:
name1 = name2;
代替:
*name1 = *name2;
或更可能您想要这样:
char name1[] = "Franz";
char name2[] = "Otto";
现在name1
和name2
是堆栈中的数组,您可以根据需要对其进行修改。在只有 pointers name1
和name2
出现在堆栈之前,而不是实际的字符串“ Franz”和“ Otto”。
顺便说一句,您的程序中没有指针算术。
您应该阅读C课本中有关字符串的章节和有关指针的章节。
答案 1 :(得分:1)
代替这个
*name1 = *name2;
输入:
name1 = name2;
现在,您要重新分配指向名称的指针,而不是实际名称本身。您不能重新分配实际名称,因为它是程序二进制文件的一部分,因此是只读的。
此外,为了反映该事实并防止此类错误,请对此进行更改
char* name1;
char* name2;
到
const char* name1;
const char* name2;
两个变量都在我应该访问的堆栈中。
很好的观察! name1
和name2
确实在堆栈中,您可以随意更改它们,但不能更改*name1
和*name2
。