realloc() 第一次调用后不分配
realloc() not allocating after first call
我一直收到分段错误(我知道这意味着什么,我只是不明白为什么我一直收到它们)。
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()
一切正常。第二次刚要给新分配的内存赋值就报segmentation fault错误
调试消息的输出是:
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()
需要一个指向由 [分配的内存的指针=19=]。
我通过 cardsSize
跟踪大小,并将其与 sizeof
结合使用以重新分配正确的内存量。我通过检查它是否返回 NULL
指针来检查 realloc()
是否成功。
然后我取消引用它两次,这样我就可以在我的初始指针现在指向的内存点之一中放置一个值。
**(cardsptr + cardsSize - 1)
应该改成*(*cardsptr + cardSize - 1)
,或者更直观地说,(*cardsptr)[cardSize-1]
.
问题是**(cardsptr + cardsSize - 1)
。
您将 cardsSize - 1
添加到指向 cards
变量的指针。 cardsptr
指向堆栈中的内容。因此,向其添加 cardsSize - 1
会将您移至堆栈中您显然无法取消引用的内容 - 并且不打算取消引用。
所以要么使用 *(*cardsptr + cardsSize - 1)
要么不那么晦涩难懂 (*cardsptr)[cardsSize - 1]
。
我一直收到分段错误(我知道这意味着什么,我只是不明白为什么我一直收到它们)。
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()
一切正常。第二次刚要给新分配的内存赋值就报segmentation fault错误
调试消息的输出是:
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()
需要一个指向由 [分配的内存的指针=19=]。
我通过 cardsSize
跟踪大小,并将其与 sizeof
结合使用以重新分配正确的内存量。我通过检查它是否返回 NULL
指针来检查 realloc()
是否成功。
然后我取消引用它两次,这样我就可以在我的初始指针现在指向的内存点之一中放置一个值。
**(cardsptr + cardsSize - 1)
应该改成*(*cardsptr + cardSize - 1)
,或者更直观地说,(*cardsptr)[cardSize-1]
.
问题是**(cardsptr + cardsSize - 1)
。
您将 cardsSize - 1
添加到指向 cards
变量的指针。 cardsptr
指向堆栈中的内容。因此,向其添加 cardsSize - 1
会将您移至堆栈中您显然无法取消引用的内容 - 并且不打算取消引用。
所以要么使用 *(*cardsptr + cardsSize - 1)
要么不那么晦涩难懂 (*cardsptr)[cardsSize - 1]
。