gpt4 book ai didi

c - 标记化数组 : signal SIGABRT error 上的 realloc()

转载 作者:太空狗 更新时间:2023-10-29 15:02:10 25 4
gpt4 key购买 nike

在第 56 行,我正在尝试调整数组的大小:

tokenArray = (char**) realloc(tokenArray, tokSize * (sizeof(char)));

我得到一个错误:

(11972,0x7fff7ca4f300) malloc: * error for object 0x100105598: incorrect checksum for freed object - object was probably modified after being freed. * set a breakpoint in malloc_error_break to debug

这是一个类的编程作业,我被特别指示动态分配我的数组,然后根据需要扩展。我已经广泛搜索了另一个对我来说不太高级的线程,但还没有运气......所以希望我能得到一些帮助。谢谢!这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ROW_SIZE 81

void strInput(char str[], int numElem);


int main(int argc, const char * argv[])
{
printf("Enter a string of any number of integers separated by spaces or tabs.\n");
printf("Maximum string length is 80 characters.\n");
printf("Enter an empty string to conclude input.\n");


int arrSize = 10, tokSize = 10, i = 0, j = 0;

char** inputArray = malloc(arrSize * (sizeof(char)));
char** tokenArray = malloc(tokSize * (sizeof(char)));


do {
inputArray[i] = malloc(MAX_ROW_SIZE * sizeof(int));

strInput(inputArray[i], arrSize);

if ((inputArray[i][0] != '\0') && (i == (arrSize - 1)))
{
arrSize = arrSize * 2;
inputArray = (char**) realloc(inputArray, arrSize * (sizeof(char)));
}

while (inputArray[i][j] != '\0')
{
printf("%c", inputArray[i][j]);
j++;
}
j = 0;

i++;
} while (inputArray[i-1][0] != '\0');

i = 0;

while (inputArray[i][0] != '\0')
{

if ((tokenArray[j] = strtok(inputArray[i], " \t")))
j++;
while ((tokenArray[j] = strtok(NULL, " \t")))
{
if (j == (tokSize - 1))
{
tokSize = 2 * tokSize;

//This is the line where I get the error
tokenArray = (char**) realloc(tokenArray, tokSize * (sizeof(char)));
}
j++;
}
i++;
}

printf("printing the tokenized arrays: ");
for (i = 0; i < j; i++)
printf("%s ", tokenArray[i]);

free(inputArray);
free(tokenArray);

return 0;
}

void strInput(char str[], int numElem)
{


int j, k = 0;

j = k;

while ((str[k] = getchar()) != '\n')
{
k++;
}

if (str[k] == '\n')
str[k] = '\0';
}

最佳答案

1. Do not cast the result of malloc and friends.

充其量是无用的,最坏的情况是危险的。

2。请注意您正在使用 malloc 的大小。

char** inputArray = malloc(arrSize * (sizeof(char)));

这没有任何意义,可能是偶然的。根据经验,您要malloc 的类型和您指向结果存储的指针应该只有一个间接性不同。即:

char** inputArray = malloc(arrSize * sizeof(char*));
// ^^ Double-pointer vs Single pointer ^

更好的经验法则,让编译器来解决。 sizeof 可以从表达式中推断出它应该测量的类型。

char **inputArray = malloc(arrSize * sizeof(*inputArray));

这是有效的,因为 sizeof 的操作数是一个未计算的上下文。指针实际上不会被解除引用,只会推导其类型。
旁注:sizeof 的括号不需要围绕表达式,但为了清楚起见,我保留了它们。一旦您感到满意,请移除它们。

3。检查分配是否成功。

malloc 和 friend 遇到麻烦会返回NULL。你应该检查一下。

4。修复你的 realloc

inputArray = realloc(inputArray, /*...*/);

这是错误的。如上所述,如果 realloc 失败,它将返回 NULL 并且什么都不做。这意味着 inputArray 仍然指向它之前的存储。也就是说,直到您用刚刚返回的 NULL realloc 击败此指针,并泄漏所述存储。糟糕。

始终存储、检查并然后分配 realloc 的结果。

char **inputArray_ = realloc(inputArray, /*...*/);
if(!inputArray_) {
/* Allocation failure, handle it and break out */
}
inputArray = inputArray_;

关于c - 标记化数组 : signal SIGABRT error 上的 realloc(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29937976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com