以下代码如何导致seg错误?基本上我将头指针复制到temp后,头指针就消失了。
typedef struct address * paddress; // defines struct pointer
void addAddressToList(paddress head, int addr[])
{
if (head == NULL) {
//head->addrArray = addr; // if list is initially empty
} else {
paddress temp;
temp = head;
while (temp->right != NULL) {
temp = temp->right; // go to end of the list
}
paddress newAddress = (paddress)malloc(sizeof(paddress*));
newAddress->intAddr = addr;
newAddress->right = NULL;
newAddress->left = temp; // connect the new address
temp->right = newAddress;
}
}
main() {
paddress addressListHead;
addressListHead = (paddress)malloc(sizeof(paddress*));
int intAddr1[] = {1,2,3,4,5,6,7};
char hexAddr1[] = "123456";
int intAddr2[] = {16,14,13,12,11};
char hexAddr2[] = "fedcb";
addressListHead->intAddr = intAddr1;
addressListHead->hexAddr = hexAddr1;
addAddressToList(addressListHead, intAddr2);
}
答案 0 :(得分:2)
paddress addressListHead;
addressListHead = (paddress)malloc(sizeof(paddress*));
似乎摆脱了编译错误,你有类型转换了malloc返回paddress
的内容。 addressListHead
是一个指针,这意味着它可以保存对象的地址但不指针的地址。 malloc here语句不会创建对象。你需要改变这个 -
addressListHead = (paddress)malloc(sizeof(paddress*));
到
addressListHead = (paddress)malloc(sizeof(struct address));
在main
和addAddressToList
个函数中。
分段错误:
else {
paddress temp;
temp = head;
while (temp->right != NULL) {
temp = temp->right; // go to end of the list
}
我理解paddress::right
是一个指针,指出你将它与 NULL 进行比较。但是temp::right
被初始化为什么。它指向一些垃圾地址,因此不能要求它与 NULL 进行比较。使其指向有效的内存位置。
答案 1 :(得分:1)
在main()中,你想要
addressListHead = (paddress)malloc(sizeof(address));
这确保您获得足够的字节来保存地址。
答案 2 :(得分:1)
您的代码中存在多个问题。
首先,通常的建议是:停止使用带有类型名称的sizeof
(尽可能多)。将sizeof
与表达式一起使用,而不是类型。类型名称属于声明而不是其他任何地方。
如果您使用此malloc
惯用语
T *p = malloc(n * sizeof *p);
即。 sizeof
应该应用于*p
,其中p
是指向要分配的数组的指针,n
是该数组中元素的总数。这样你就不必猜测你应该在sizeof
下指定什么类型的名称(这样你的代码就会变成与类型无关的。)
在您的情况下,您只分配一个对象,因此代码应该看起来像
paddress newAddress = malloc(sizeof *newAddress);
(并且不要施放malloc
的结果 - 这样做绝对没有意义。)
其次,当您是列表的head元素时,您需要初始化所有字段。但是你永远不会在head元素中初始化right
(或left
)。因此即使分配了正确的内存量也会崩溃。
答案 3 :(得分:0)
第一个错误:
addressListHead = (paddress)malloc(sizeof(paddress*));
paddress *表示指向paddress的指针,paddress本身是指向struct address的指针。因此paddress *是指向struct address的指针。你想做的事:
addressListHead = (paddress)malloc(sizeof(struct address));
另外,我发现你昨天犯了类似的错误。 Why do I get a seg fault? I want to put a char array pointer inside a struct
正确理解指针的概念很重要。我肯定会建议你阅读一些关于指针的教程。如果您需要帮助,请告诉我。