复制指针时出现Seg Fault

时间:2011-10-03 21:53:27

标签: c segmentation-fault

以下代码如何导致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);
}

4 个答案:

答案 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));

mainaddAddressToList个函数中。

分段错误:

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

正确理解指针的概念很重要。我肯定会建议你阅读一些关于指针的教程。如果您需要帮助,请告诉我。