Я упростил проблему, из-за которой пытался изолировать проблему, но это не помогает.
У меня есть двумерный массив символов для представления памяти. Я хочу передать ссылку на эту симуляцию памяти в функцию. В функции для проверки содержимого памяти я просто хочу перебрать память и распечатать содержимое каждой строки.
Программа выводит первую строку, а затем я получаю ошибку сегмента.
Моя программа выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void test_memory(char*** memory_ref) {
int i;
for(i = 0; i < 3; i++) {
printf("%s\n", *memory_ref[i]);
}
}
int main() {
char** memory;
int i;
memory = calloc(sizeof(char*), 20);
for(i = 0; i < 20; i++) {
memory[i] = calloc(sizeof(char), 33);
}
memory[0] = "Mem 0";
memory[1] = "Mem 1";
memory[2] = "Mem 2";
printf("memory[1] = %s\n", memory[1]);
test_memory(&memory);
return 0;
}
Это дает мне вывод:
memory[1] = Mem 1
Mem 0
Segmentation fault
Если я изменю программу и создаю локальную версию памяти в функции, разыменовав memory_ref, то получу правильный вывод:
Итак:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void test_memory(char*** memory_ref) {
char** memory = *memory_ref;
int i;
for(i = 0; i < 3; i++) {
printf("%s\n", memory[i]);
}
}
int main() {
char** memory;
int i;
memory = calloc(sizeof(char*), 20);
for(i = 0; i < 20; i++) {
memory[i] = calloc(sizeof(char), 33);
}
memory[0] = "Mem 0";
memory[1] = "Mem 1";
memory[2] = "Mem 2";
printf("memory[1] = %s\n", memory[1]);
test_memory(&memory);
return 0;
}
дает мне следующий вывод:
memory[1] = Mem 1
Mem 0
Mem 1
Mem 2
это то, что я хочу, но создание локальной версии памяти бесполезно, потому что мне нужно иметь возможность изменять значения исходной памяти из функции, которую я могу сделать только разыменованием указателя на исходный 2d-символ массив.
Я не понимаю, почему я должен получить ошибку сегмента во второй раз, и я был бы благодарен за любой совет.
Большое спасибо
Джо