【发布时间】:2016-07-12 08:41:21
【问题描述】:
我不断收到分段错误(我知道这意味着我只是不明白为什么我不断收到它们)。
int main(void)
{
srand(time(NULL));
int cardsSize = 0; //tracks the amount of memory space my pointer is pointing too.
int *cards = NULL;
if(drawCard(&cards, ++cardsSize) == -1)
{
printf("Memory allocation failed.\n");
return 0;
}
if(drawCard(&cards, ++cardsSize) == -1)
{
printf("Memory allocation failed.\n");
return 0;
}
//... more code
}
realloc() 被调用的部分:
int drawCard(int **cardsptr, int cardsSize)
{
int newCard = rand() % 13;
printf("Address before:\t%p\ncardsSize:\t%d\n", *cardsptr, cardsSize); //an attempt at debugging by examining if the null pointer actually gets an address.
*cardsptr = realloc(*cardsptr, cardsSize * sizeof(int));
printf("Address after:\t%p\n", *cardsptr);
if(*cardsptr == NULL)
return -1;
if (newCard > 10)
**(cardsptr + cardsSize - 1) = 10;
else
**(cardsptr + cardsSize - 1) = newCard;
printf("Reached.\n"); //to see if I crash before or after trying to assign a value.
return 0;
}
第一次调用drawCard() 一切正常。当我想为新分配的内存赋值时,第二次出现分段错误错误。
调试消息的输出是:
Address before: (nil)
cardsSize: 1
Address after: 0x2428010
Reached.
Address before: 0x2428010
cardsSize: 2
Address after: 0x2428010
Segmentation fault (core dumped)
据我所知,它应该可以工作。
我将一个指向NULL 的指针传递给drawCard() 函数,并在调用realloc() 时取消引用它。这使得realloc() 的行为类似于malloc(),这也确保了将来可以将该指针传递给realloc(),因为realloc() 需要一个指向由malloc() 分配的内存的指针。
我通过cardsSize 跟踪大小并将其与sizeof 结合使用以重新分配适量的内存。我通过检查是否返回NULL 指针来检查realloc() 是否成功。
然后我取消引用它两次,这样我就可以在我的初始指针现在指向的内存点之一中放置一个值。
【问题讨论】:
-
**(cardsptr + cardsSize - 1) =。为了使人保持良好和冗长的理智状态,请使用方括号。你有数组吗?像数组一样使用它。 -
如果
realloc失败,则原块不变。但是,您会用realloc的结果覆盖指针,从而丢失原始块。这是内存泄漏。您也不会释放您分配的块。这里的风格不好,但在许多其他程序中都有问题。养成用小代码做正确的习惯,这样你就会在关键的地方正确完成。 -
@Olaf 使用临时指针在现在需要的地方接收 realloc() 和 free()。谢谢。
标签: c pointers segmentation-fault realloc