2015-08-04 4 views
0

У меня есть двумерный массив указателей, объявленных в главном какСтранного выход при прохождении массива указателей - С

char* data[3][8] 

, который я прошел в функцию

void func(char*** data) 

Когда я сделал printf("%p\n", data[0]); в main и в функции я получил разные выходы 0x7ffeabc27640 в главном и (nil) в функции. Хотя печать только data выводит тот же адрес, что и внутри main. Почему я не могу получить доступ к массиву в функции.

+2

Включите предупреждения и повторите попытку. – this

+2

2D-массив указателей, которые вы пытаетесь передать, не является символом 'char ***'. –

ответ

5

Если включить некоторые предупреждения (которые вы всегда должны делать), вы получите:

main.cpp: In function 'main': 
main.cpp:6:10: warning: passing argument 1 of 'func' from incompatible pointer type 
    func(data); 
     ^
main.cpp:2:6: note: expected 'char ***' but argument is of type 'char * (*)[8]' 
void func(char*** data) { (void)data; } 
    ^

Который говорит вам именно то, что случилось, а именно, что массив не является указателем. Выделение указателя, который был преобразован в неправильный тип, является неопределенным поведением, поэтому вы можете вернуть что-либо обратно.

Имейте свою функцию взять в char *(*)[8], если вы хотите, чтобы придать ему char *(*)[8]:

void func(char *(*data)[8]); 

Или, если вы хотите, чтобы подчеркнуть, что data должен указывать на первый элемент массива:

void func(char *data[][8]); 

Два синтаксиса совершенно эквивалентны.

Примечание: файл имеет имя main.cpp, но действительно скомпилирован в режиме C.

+0

Так что просто для завершения ответа. Ваш прототип функции должен быть либо 'foo (char * bar [3] [8]);' или 'foo (char * bar [] [8]);'. Если вы решите использовать вторую, вы также можете передать количество элементов (первого измерения вашего массива) в качестве второго параметра функции, предложенного @Neil. – Moucheg

+0

@kimimsc 'foo (char * bar [] [8])' является сахаром для 'foo (char * (* bar) [8])'. Я сохраняю этот ответ как минимальное решение для фактической ошибки, Нил выкопал большую демонстрацию, и нет смысла повторять ее. – Quentin

+0

Да, я знаю, что, но я не уверен, что ОП делает (с), что он, похоже, не знает разницы между (char *** и char * [n] [m]). – Moucheg

0

Передача 2D массивов в функции -

Это поможет вам чтения и лучше понять, как это сделать ...

http://www.geeksforgeeks.org/pass-2d-array-parameter-c/

Ниже приведен фрагмент из web- page - показывает пример того, как это сделать.

#include <stdio.h> 
const int n = 3; 

void print(int arr[][n], int m) 
{ 
    int i, j; 
    for (i = 0; i < m; i++) 
     for (j = 0; j < n; j++) 
     printf("%d ", arr[i][j]); 
} 

int main() 
{ 
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 
    print(arr, 3); 
    return 0; 
} 

Output: 

1 2 3 4 5 6 7 8 9 
+0

... случайный downvote? – Quentin

+0

Я действительно задавался вопросом. Спасибо, что заметили Quentin – Neil

Смежные вопросы