Ошибка при обращении к двумерному массиву char, размещенному в стеке, из другой функции - C (СИ)

Узнай цену своей работы

Формулировка задачи:

int main() {
    char s[2][6] = { "test1\0", "test2\0" };
    foo(s);
}
 
void foo(char** array) {
    putchar(arr[0][0]); //ошибка - чтение 0x00000000
}
int main() {
    char** s = (char**)malloc(sizeof(**s) * 2);
    s[0] = (char*)malloc(sizeof(*s) * 6);
    data[0] = "test1\0";
    foo(s);
}
 
void foo(char** array) {
    putchar(arr[0][0]); //ошибки нет
}
int main() {
    char *s[2][6] = { "test1\0", "test2\0" };
    foo(s);
}
 
void foo(char** array) {
    putchar(arr[0][0]); //ошибки нет
}
int main() {
    char s[2][6] = { "test1\0", "test2\0" };
    putchar(arr[0][0]); //ошибки нет
}
Объясните, пожалуйста, почему так происходит. И почему нет ошибки, если вызвать "putchar(arr[0][0]);" из функции main?

Решение задачи: «Ошибка при обращении к двумерному массиву char, размещенному в стеке, из другой функции»

textual
Листинг программы
int main() {
    char s[2][6] = { "test1\0", "test2\0" };
    foo(s);
}
void foo(char* array[6]) {
    putchar(arr[0][0]); 
}

Объяснение кода листинга программы

  1. В функции main() создается двумерный массив char s[2][6] = { test1\0, test2\0 };
  2. Затем вызывается функция foo(s);
  3. В функции foo() передан массив char* array[6]
  4. В функции foo() происходит попытка доступа к элементу массива arr[0][0]
  5. В результате возникает ошибка, так как в функции foo() массив представлен как указатель на массив, а не как двумерный массив.
  6. Поэтому попытка доступа к элементу массива arr[0][0] приводит к неопределенному поведению.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5