意外的strcpy segfault

时间:2016-02-25 18:26:38

标签: c struct segmentation-fault

我发现了一个我在分析时遇到问题的段错误。为避免您认为我没有搜索过,我不会认为问题与this question中的问题相同。我有以下typedef' d结构:

typedef struct usage usage;
struct usage{
      char name[9]; 
      int loc;  
      usage *next;
};

我从包含数字K后跟K对(S,D)的文件中读取数据,其中S = 8个字符的字符串[这是变量名称],d =整数[a记忆位置]。

以下是导致错误的代码:

void addUse(int index,char *nm, int addr){
     usage *temp;
     strcpy(temp->name,nm); //segfault here. 
     temp->loc = addr;
     temp->next= NULL;
    /* more processing */
}

为了使这个更清楚,我从我所拥有的块中调用此函数

int dummyIndex = 1;
char s1[9];
int val1; 
scanf(" %s %d, s1, &val1);
addUse(dummyIndex, s1, val1);

似乎我在问题中链接的问题是他们没有在堆上分配char。我不确定这里发生了什么。使用字段strcpy对另一个struct上的char name[9]使用相同的调用就可以了。

我错过了什么?我看了什么?

提前致谢!

4 个答案:

答案 0 :(得分:1)

您已经忘记初始化临时指针,因此它指向随机内存。当你写下

strcpy(temp->name, mm);

您正在跟随指向随机地址的指针并在那里写入字节,因此是段错误。

答案 1 :(得分:1)

问题出在您的代码的以下行

usage *temp;
strcpy(temp->name,nm); //segfault here. 

您没有初始化temp指针,因此它占用了垃圾值。

尝试在strcpy

之前初始化它
usage *temp = malloc(sizeof(usage));

希望这有帮助。

答案 2 :(得分:0)

这是我的问题:

在其他调用中,我确保将temp = malloc(sizeof(struct));设置为不在此处,因此我尝试写入尚未分配的内存!

答案 3 :(得分:0)

您的代码问题很明显,SegFault发生在它应该的确切位置。原因是你使用的是以前没有分配的内存。

void addUse(int index,char *nm, int addr){
     usage *temp;
     strcpy(temp->name,nm); //segfault here. 
     // ...
}

当您声明“用法 * temp;”时您正在创建用法类型的指针 temp 。了不起。但是......指针指向哪里?你不知道。 temp 的值,它包含的内存地址是它在创建时在内存中占用的位置的垃圾(其他编程语言给未初始化的变量赋予默认值,但C是不在那个组中。)

所以......你很幸运。你的程序最好被描述为“undefined behaviour”,因为temp可能包含一个随便未被占用的内存地址:你的程序可以运行通过这个函数,在其他地方崩溃,你不会知道为什么。

另一个问题是,当您的函数返回void时,您应该返回新的 struct 用法。

这是应该的功能:

usage * addUse(int index,char *nm, int addr){
     usage *temp = malloc(sizeof(usage));

     if ( temp == NULL) {
         fprintf(stderr, "Not enough memory");
         exit(EXIT_FAILURE);
     }

     strcpy(temp->name,nm); //segfault here. 
     temp->loc = addr;
     temp->next= NULL;
    /* more processing */

     return temp;
}

我知道您应该将 addUse()返回的指针链接到链接列表。

希望这有帮助。

相关问题