我不断出现分段错误(我知道这意味着我只是不明白为什么我会继续得到它们。)
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()
需要一个指针指向由{分配的内存“ {1}}。
我通过malloc()
跟踪大小,并将其与cardsSize
结合使用以重新分配适量的内存。我通过检查它是否返回sizeof
指针来检查realloc()
是否成功。
然后我取消引用它两次,这样我就可以在我的初始指针现在指向的一个内存点中放置一个值。
答案 0 :(得分:2)
**(cardsptr + cardsSize - 1)
应更改为*(*cardsptr + cardSize - 1)
,或更直观,(*cardsptr)[cardSize-1]
。
答案 1 :(得分:2)
问题是**(cardsptr + cardsSize - 1)
。
您将cardsSize - 1
添加到指向cards
变量的指针。 cardsptr
指向堆栈中的某些内容。因此,向它添加cardsSize - 1
会将您移动到堆栈中您显然无法取消引用的内容 - 并且不打算取消引用。
因此,请使用*(*cardsptr + cardsSize - 1)
或更少隐晦(*cardsptr)[cardsSize - 1]
。