Работа с «многомерными» «динамическими массивами» в C - PullRequest
1 голос
/ 10 января 2012

Я пытался выполнить следующий код.Хотя задача тривиальна, я получаю ошибку сегментации.

Цель приведенного ниже фрагмента кода - создать многомерный массив с максимальным размером строки 4 и размером столбца 33. Затем после создания следует установитьсодержимое всех строк как 0, за которым следует символ '\0'.Затем, в конце, он должен отобразить вывод на stdout.

. Хотя я не новичок в программировании, я продолжаю получать подобные ошибки, поэтому, если возможно, пожалуйста, объясните мне, как я могу избежать таких ошибок вбудущее.

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

int main(int argc, char* argv[])
{
        int i,j,k,x,y;
        char** arr;
        arr = (char**) malloc(4 * sizeof(char*));
        for ( i = 0; i < 4; i++) {
                arr[i] = (char*) malloc(9 * sizeof(char));
                memset(arr,0,8);
                arr[i][8] = '\0';
        }
        for ( j = 0; j<4; j++) {
                puts(arr[j]);
        }
        return 0;
}

Ответы [ 3 ]

5 голосов
/ 10 января 2012

Вы memset указали неправильный указатель.

Вместо:

memset(arr,0,8);

Вы хотите:

memset(arr[i],0,8);

Итак, вы отклонены от одного уровня косвенности.


Как указано в комментариях, вот некоторые оптимизации:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(9 * sizeof(char));
    memset(arr[i],0,9);
}

или

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) calloc(9, sizeof(char));
}

Обратите внимание, что приведение к char* не обязательно в C.


Если вы хотите, чтобы символ '0' вместо нулевого символа, то вы должны пойти с этим:

for ( i = 0; i < 4; i++) {
    arr[i] = (char*) malloc(8 * sizeof(char));
    memset(arr[i],'0',8);
    arr[i][8] = '\0';
}
1 голос
/ 10 января 2012
memset(arr,0,8);

- проблема, вы очищаете массив указателей

try:

memset(arr[i], '0', 8);

, если вы хотите заполнить строку нулями

0 голосов
/ 10 января 2012

в цикле for Я думаю, что у вас есть логическая ошибка:

memset(arr[i],0,8);

вам также не нужно устанавливать это:

arr[i][8] = '\0';

, вместо этого вы можете сделать это:

memset(arr[i],0,9);

символ '\ 0' ничем не отличается от 0.

...