Проблемы с работой многомерного массива C - PullRequest
0 голосов
/ 01 апреля 2020

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

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define charLength  5
#define bytesLength charLength*sizeof(char)
int n;
char**  T=0;
void fillT(int n){
    char* __T[n];
    for(int i=0; i<n; i++) {
        __T[i] = (char*)malloc(bytesLength);
        scanf("%s",__T[i]);
    }
    T = __T;
}
void foo(){
    n = 3;
    fillT(n);
}
int main(){
    foo();
    for(int i=0; i<n; i++){  //works OK
        printf("%d %s\n",i,T[i]);
    }
    for(int i=0; i<n; i++){  //doesn't work!!!, Why???
        printf("%s\n",T[i]);
    }
}

Мне нужно получить последнее для работы l oop, но по какой-то причине я не могу понять Я не смог.

Это является текущим выходом.

1 Ответ

1 голос
/ 01 апреля 2020

Проблема:

char* __T[n];

Если любой другой строковый элемент является динамическим c в вашем коде, это одиночка. Эта переменная (массив строк) размещается в стеке. Таким образом, он будет мертв после завершения функции fillT. Но вы назначаете ее глобальной переменной перед выходом из функции, тогда в чем проблема? Это порождает большую проблему: Неопределенное поведение .

Глобальный char** T указывает на то, что уже уничтожено. Попытка доступа к нему внутри обоих циклов - неопределенное поведение. Когда я запустил код, оба цикла дали неправильный вывод. Интересно, как вы получили правильный вывод в первом l oop, может быть, вам просто повезло, потому что неопределенное поведение может означать что угодно.

Решение:

Сделать выделенный стек __T переменная, выделенная в куче, которая будет работать до тех пор, пока ваша программа не прекратит работу или вы не free.

замените char* __T[n]; на

char** __T = malloc(n * sizeof(char*));

...