Единственная серьезная проблема, которую я вижу в вашем коде, заключается в том, что вы приводите возвращаемое значение malloc(3)
, и, вероятно, вы забыли также #include <stdlib.h>
(это опасный коктейль), и таким образом вы уничтожаете возвращаемое значение вызова с приведенным вами актом до malloc(3)
. Позвольте мне объяснить:
- Во-первых, у вас есть (или нет, но я должен догадаться) 64-битная архитектура (как это принято сегодня), а указатели имеют ширину 64 бит в вашей системе, тогда как
int
целые числа 32-битные. - Вы, вероятно, забыли
#include <stdlib.h>
в своем коде (что я тоже должен догадаться), поэтому компилятор предполагает, что malloc(3)
на самом деле функция, возвращающая int
(это унаследовано в C, если вы не предоставите прототип для функции, внешней по отношению к модулю компиляции), поэтому компилятор генерирует код, чтобы получить только 32-битное значение из функции malloc(3)
, и не 64-битный указатель, который (вероятно, но я должен также догадываться) malloc(3)
на самом деле возвращает. - Вы приводите это
int
32-битное значение (уже неверное) к 64-битному указателю (гораздо более неправильный, но Я должен догадаться ...), делая любое предупреждение о преобразованиях типов между целочисленными значениями и указателями, чтобы исчезнуть, и замолчать, когда вы ставите приведение (компилятор предполагает, что в качестве мудрой программы Более того, вы специально поставили приведение и знаете, что делаете) - Первое (неопределенное поведение) возвращаемое значение (неопределенное поведение) просто сокращается до 32 бит, а затем преобразован (от
int
до char *
, с более неопределенным поведением) для использования в вашем коде. Это делает исходный указатель, возвращаемый из malloc(3)
, совершенно другим значением при повторной интерпретации и приведении к (char *)
. Это заставляет ваши указатели указывать на другое место и прерывать выполнение вашей программы.
Ваш код должен быть примерно таким (опять же, должен использоваться фрагмент, так как ваш код не завершен) :
#include <stdlib.h> /* for malloc() */
/* ... */
char *arr[rownum2];
for (i = 0; i < rownum2; i++) {
arr[i] = malloc(colnum); /* sizeof(char) is always 1 */
Мне, наконец, нужно дать вам рекомендацию:
Пожалуйста, прочитайте (и следуйте) , как создать минимальную, проверяемую страницу примера , как Ваша вероятная ошибка #include
- это то, о чем я должен был догадаться .... Публикация фрагментов кода много раз делает ваши ошибки на go, и мы должны угадать, что здесь может происходить. Это самая важная вещь, которую вы должны извлечь из этого ответа. Размещать полный, компилируемый и проверяемый код (т. Е. Код, который вы можете проверить, перед отправкой не проходит, а не фрагмент, который вы выбрали, где вы предполагаете проблема может быть). Размещенный вами код не позволяет никому проверить причину сбоя, потому что он должен быть завершен (и, вероятно, исправлен), чтобы сделать его исполняемым.