为什么这段简单的C代码会出现分段错误?

时间:2015-11-30 07:15:11

标签: c segmentation-fault strcpy

#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]);
}

我显然缺少一些非常基本但却无法弄清楚的东西。

4 个答案:

答案 0 :(得分:1)

strcpy()函数的参数不匹配。

根据man page char *strcpy(char *dest, const char *src);

使用字符串副本

因此,strcpy()来电必须为strcpy(p[0], "hello");

答案 1 :(得分: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]);
}
  

输出你好

答案 2 :(得分:0)

请阅读strcpy()的{​​{3}}。它说

  

char *strcpy(char *dest, const char *src);

所以,你需要将第一个参数作为目的地(又名复制到),第二个 >一个作为来源(又名来自的复制品)。

在您的情况下,"hello"已作为副本提供给地址,"hello"是字符串文字,尝试将任何内容复制到其中(即修改string literal)将导致man page,这会导致分段错误。

解决方案:交换函数调用的参数。

答案 3 :(得分:0)

strcpy以相反的顺序获取其参数:destination first,source second。尝试:

strcpy(p[0], "hello");