为什么这段简单的 C 代码会出现分段错误?
Why is this simple piece of C code giving a segmentation fault?
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int size_to_alloc = sizeof(char*) * 1;
char** p = (char**) malloc(size_to_alloc);
p[0] = (char*) malloc (sizeof(char) * 10);
strcpy("hello", p[0]);
printf("%s\n", p[0]);
}
我显然缺少一些非常基本的东西,但无法弄清楚是什么。
只需在 strcpy 函数中做一些小改动:char *strcpy(char *dest, const char *src)
.
dest : 目标数组
src : 要复制的字符串。
喜欢:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int size_to_alloc = sizeof(char*) * 1;
char** p = (char**) malloc(size_to_alloc);
p[0] = (char*) malloc (sizeof(char) * 10);
strcpy(p[0],"Hello"); /* change */
printf("%s\n", p[0]);
}
Output: Hello
请阅读 strcpy()
的 man page。它说
char *strcpy(char *dest, const char *src);
因此,您需要将 first 参数作为 destination(又名,copy to), second 一个作为 source (aka copy from).
在您的情况下,"hello"
已作为 复制到 地址提供,并且 "hello"
是字符串文字,请尝试将任何内容复制到其中(即,修改字符串文字)将导致 undefined behavior,从而导致分段错误。
解决方法:交换函数调用的参数。
strcpy
以相反的顺序接受参数:首先是目标,其次是源。尝试:
strcpy(p[0], "hello");
strcpy()
函数的参数不匹配。
根据 man page char *strcpy(char *dest, const char *src);
使用字符串复制
所以你的 strcpy()
调用必须是 strcpy(p[0], "hello");
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int size_to_alloc = sizeof(char*) * 1;
char** p = (char**) malloc(size_to_alloc);
p[0] = (char*) malloc (sizeof(char) * 10);
strcpy("hello", p[0]);
printf("%s\n", p[0]);
}
我显然缺少一些非常基本的东西,但无法弄清楚是什么。
只需在 strcpy 函数中做一些小改动:char *strcpy(char *dest, const char *src)
.
dest : 目标数组
src : 要复制的字符串。
喜欢:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int size_to_alloc = sizeof(char*) * 1;
char** p = (char**) malloc(size_to_alloc);
p[0] = (char*) malloc (sizeof(char) * 10);
strcpy(p[0],"Hello"); /* change */
printf("%s\n", p[0]);
}
Output: Hello
请阅读 strcpy()
的 man page。它说
char *strcpy(char *dest, const char *src);
因此,您需要将 first 参数作为 destination(又名,copy to), second 一个作为 source (aka copy from).
在您的情况下,"hello"
已作为 复制到 地址提供,并且 "hello"
是字符串文字,请尝试将任何内容复制到其中(即,修改字符串文字)将导致 undefined behavior,从而导致分段错误。
解决方法:交换函数调用的参数。
strcpy
以相反的顺序接受参数:首先是目标,其次是源。尝试:
strcpy(p[0], "hello");
strcpy()
函数的参数不匹配。
根据 man page char *strcpy(char *dest, const char *src);
所以你的 strcpy()
调用必须是 strcpy(p[0], "hello");