【发布时间】:2012-04-17 05:39:03
【问题描述】:
好的,这里是正在发生的事情的要点:
我将一个字符数组(char[x]) 传递给一个函数,该函数的参数被定义为一个字符指针(char *)。一旦在函数内部,我分配了另一个字符指针(这是我拥有的结构的一部分)。一旦我将传入参数分配给结构的字符指针,就会出现分段错误;像这样。
temp->name = (char*)malloc(sizeof(char));
temp->name = name;
这就是我之前使用该功能的方式:
char *name = "HEY";
Function(name);
以下是我在错误中使用它的方式:
char name[3] = "HEY";
Function(name);
使用上面相同的语句,它工作正常。通过将名称更改为常量“嘿”,使用相同的输入,一切顺利,我确保它不是其他任何东西。
如果有人能想到一个原因,我将非常感谢您的帮助。谢谢!
完整的功能如下:
- openList 是指向结构链表开头的指针
- tempOpen 是一个临时指针,我们可以利用它来搜索列表,而无需更改 openList 的位置
- findOpenSetSID/findItem -> 通过 SID/key 在链表中查找结构
- answerOpen/answerItem -> 1 == 第一个节点,2 == 任何其他节点,0 = 未找到
以下是所涉及结构的简要摘要。 开放结构是指向另一个结构(称为集合结构)的指针的链表 集合结构是名称、sid 和项结构的链表 项目结构是数据和键的链表
Error_t WRITE(Sid_t sid, char *key, char *data){
Open_p_t tempOpen = openList; //setting a pointer to a struct
int answerOpen = findOpenSetSID(sid, &tempOpen);
if(answerOpen > 0){
Set_p_t targetNode;
if(answerOpen == 1){
targetNode = tempOpen->file;
}
else{
targetNode= tempOpen->next->file;
}
Item_p_t tempItem = targetNode->items;
int answerItem = findItem(key, &tempItem);
Item_p_t targetItem;
targetItem = (Item_p_t)malloc(sizeof(Item_t));
if(answerItem > 0){
if(answerItem == 1){
targetItem = targetNode->items;
}
else{
targetItem = targetNode->items->next;
}
targetItem->data = data;
}
else{
**targetItem->data = data;** <<<The problem line.
basically I am just adding
items to my sets. But this line
freaks out when the input changes
from char* to char[]
targetItem->key = key;
targetItem->next = targetNode->items;
targetNode->items = targetItem;
}
return 0;
}
return 1;
}
这是输入段:
char key[32], data[64]; // reads in data using fscanf(fd, "%s %s", key data)
then calls WRITE(setId, key, data);
【问题讨论】:
-
请显示演示问题的代码。描述往往令人困惑或误导。
-
我不知道您为什么会遇到段错误(您没有显示足够的代码来猜测),但是您对
temp->name的双重分配揭示了对 C 内存管理的根本误解。 -
看起来你应该使用 strcpy 而不是
temp->name = name;(尽管 1 个字符没有意义),除非你实际上是在尝试复制指针而不是字符串(在这种情况下你'可能造成了内存泄漏)。