В строке 56 я пытаюсь изменить размер массива:
tokenArray = (char**) realloc(tokenArray, tokSize * (sizeof(char)));
Я получаю сообщение об ошибке:
(11972,0x7fff7ca4f300) malloc: * ошибка для объекта 0x100105598: неверная контрольная сумма для освобожденного объекта - возможно, объект был изменен после освобождения. * установите точку останова в malloc_error_break для отладки
Это задание по программированию для класса, мне было специально указано динамически распределять мои массивы, а затем расширять их по мере необходимости. Я много искал другую ветку в той же теме, которая не слишком продвинута для меня, чтобы понять, но пока не повезло ... Так что, надеюсь, я смогу получить некоторую помощь. Спасибо! Вот мой код:
#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';
}
tokenArray
является указателем на указатель наchar
, но вы выделяете только с использованиемsizeof(char)
, а неsizeof(char *)
. Таким образом, ваше начальное выделение представляет собой массив из десяти символов, а не десяти указателей на символ. - person Some programmer dude   schedule 29.04.2015char** inputArray = malloc(arrSize * (sizeof(char)));
должно бытьchar** inputArray = malloc(arrSize * sizeof *inputArray);
. Это защитит вас от самого себя и сделает выделение надлежащего размера. Эта схема работает всегда. - person unwind   schedule 29.04.2015sizeof
вmalloc
(и т.п.) вы всегда должны писать его какptr = malloc(sizeof(*ptr) * ...);
вместоptr = malloc(sizeof(ptrtype*) * ...);
. - person Eregrith   schedule 29.04.2015because arrays are naturally pointers to addresses
это неправда. Вы сделали массив изchar*
-указателей, да, но также возможно сделать массив изchar
,int
,struct
и любого другого типа. - person maja   schedule 29.04.2015