c – Нарушение прав доступа при чтении массива

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

AllCurrentData[newLineCount].data[tabCount] = malloc(length + 1); strcpy( AllCurrentData[newLineCount].data[tabCount], buffer ); printf("%s", AllCurrentData[newLineCount].data[tabCount]); 

Но не может читать его вне функции. Здесь я получаю нарушение доступа, похоже, что он пытается прочитать нулевое местоположение.

Как я могу получить доступ к данным в массиве AllCurrentData в другой функции? Спасибо!

Дополнительная информация:

 typedef struct current{ char **data; }CurrentData; 

AllCurrentData объявляется в основном:

 CurrentData *AllCurrentData = '\0'; 

Вызов функции

 getCurrentData(current, AllCurrentData); printf("%s", AllCurrentData[0].data[0]); //<----- error here 

 CurrentData *AllCurrentData = '\0'; 

Это объявляет указатель. Этот указатель представляет собой переменную, которая содержит число, которое интерпретируется как адрес. Вы инициализируете указатель на ‘\ 0’ (null).

 getCurrentData(current, AllCurrentData); 

Здесь вы передаете этот указатель в качестве параметра для функции getCurrentData . В качестве указателя есть переменная, эта переменная передается по значению, что означает, что функция получает копию этого значения (номер, представляющий адрес).

Когда внутри функции, если вы пишете

 AllCurrentData = malloc... 

вы изменяете эту копию указателя, поэтому вне функции AllCurrentData все равно будет «\ 0». Вам нужно передать указатель на этот указатель (Inception, я знаю).

 getCurrentData(current, &AllCurrentData); getCurrentData(.., CurrentData **p_AllCurrentData) { *p_AllCurrentData = malloc(...); } 

Позвольте мне объяснить эту концепцию на более простом примере:

 int *v = NULL; // here v is a pointer. This pointer has value 0 (invalid address) v = malloc(10 * sizeof(int)); // here the pointer is assigned a valid address, lets say 0x41A0 f(v); void f(int *x) { // here the pointer x receives a copy of the value of the pointer v, so x will be, like v, 0x41A0 x[0] = 4; /*this is ok as you modify the memory at the address 0x41A0, so this modification is seen from outside the function, as v points to the same address.*/ x = malloc(...); /* this is NOT ok, as x receives a new address, lets say 0xCC12. But because x has a copy of the value from v, v will still be unmodified.*/ } 

поэтому, если вы хотите выделить указатель внутри функции, это не нормально:

 int *v = NULL; // here v is a pointer. This pointer has value 0 (invalid address) f(v); void f(int *x) { // here the pointer x receives a copy of the value of the pointer v, so x will be, like v, NULL x = malloc(...); /*this is NOT ok, as x receives a new address, lets say 0xCC12. But because x has a copy of the value from v, v will still be unmodified, it will still have NULL.*/ } 

Правильный способ:

 int *v = NULL; // here v is a pointer. This pointer has value 0 (invalid address) // as v is a variable (of type pointer to int), v has an address, lets say 0xAAAA. f(&v); void f(int **p_x) { /* here the p_x is a pointer to (a pointer of int), so this pointer receives a copy of the value the address of p, so p_x is 0xAAAA.*/ *p_x = malloc(...); /* lets say malloc returns the address 0xBBBB. This will be the address of our vector. *p_x= says we modify the value at the address p_x. So the value found at the adress 0xAAAA will be 0XBBBB. But because 0xAAAA is the address of v, we effectively modified the value of v to 0xBBBB. So now v has the address of our starting vector.*/ // if you want to modify values inside this vector you need: (*p_x)[0] = ... }