Создание 2d массива с проблемами (C) - PullRequest
1 голос
/ 27 октября 2010

В приведенном ниже коде я пытаюсь создать экземпляр 2d-массива, и он создается неправильно: КОД:

    FILE* kernalFile = fopen(argv[1], "r");
    int rKernalSize;
    fscanf(kernalFile, "%d", &rKernalSize);
    unsigned int rKernal[rKernalSize][rKernalSize];

Точка останова данных сразу после запуска этого кода:1005 *

rKernal VALUES:

Name : rKernal
    Details:0x7ffffffe0cd0
    Default:[0]
    Decimal:[0]
    Hex:[0]
    Binary:[0]
    Octal:[0]

или

rKernal[][0]

Это должно быть rKernal[3][3], и вот файл, который вы можете посмотреть.Если требуется:

3 -1 1 0 1 0 -1 0 -1 1 3 -1 1 0 1 0 -1 0 -1 1 3 -1 1 0 1 0 -1 0 -1 1

TLDR: rKernalSize является правильным (3), но когда я создаю 2-мерный массив с rKernal[rKernalSize][rKernalSize], он не создается правильно!Он устанавливается как rKernal[][0], может быть, это по умолчанию, но должно быть rKernal[3][3]

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Забудьте, что говорит вам отладчик.В вашем коде сразу следуйте:

unsigned int rKernal[rKernalSize][rKernalSize];

вставьте выражение:

printf ("%d\n", sizeof(rKernal) / sizeof(unsigned int));

и посмотрите, что оно печатает (надеюсь 9).

Это возможноотладочной информации, созданной во время компиляции, недостаточно для правильного определения размеров массивов переменной длины.


В качестве примера, хотя gcc поддерживает массивы переменной длины, сам gdbне смог должным образом справиться с ними совсем недавно, в конце 2009 года, и до сих пор нет упоминаний о них в документации от октября 2010 года.

Так что я подозреваю, что является проблемой, тем более что тестовый кодЯ предоставил выше вывод 9, как и ожидалось.

1 голос
/ 27 октября 2010

Основная проблема здесь в том, что rKernalSize неизвестно в время компиляции , когда выделяется этот массив. Во время компиляции значение int rKernalSize зависит от компилятора (если новый стандарт C явно не устанавливает его 0; 0 - это то значение, на которое я бы поставил). Поэтому, когда код загружен, появляется символ rKernal, который представляет адрес части памяти, не содержащей байтов.

Но затем вы запускаете программу и читаете '3' с вашим scanf; когда вы выводите результаты, вы видите «3».

Этот код, кстати, не будет работать в прямом C - вы должны выделить его перед первым исполняемым оператором. Это скомпилируется в C ++.

Теперь, если вы хотите, используя прямую C, сделать что-то подобное, вот что вам нужно:

  • Считайте ваш размер, используя Scanf.

  • Выделите память для вашего массива, используя malloc, который будет выглядеть примерно так:

х

int ** ary;
int rkSize;  // what you scanf'd into
if((ary = malloc(rkSize*rkSize*sizeof(unsigned int)))==NULL){
     // for some reason your malloc failed.  You can't do much
     fprintf(stderr,"Oops!\n");
     exit(1);
 }
 // If you got here, then you have your array
  • Теперь, из-за двойственности указателя-массива в C, вы можете рассматривать это как свой массив х

    ary[1][1] = 42; // The answer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...