問題を切り分けようとしてきた問題を単純化しましたが、役に立ちません。
メモリを表す 2 次元の char 配列があります。そのメモリのシミュレーションへの参照を関数に渡したいです。メモリの内容をテストする関数では、メモリを反復処理して、各行の内容を出力したいだけです。
プログラムが最初の行を出力した後、seg fault が発生します。
私のプログラムは次のとおりです。
#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
これは私が望むものですが、メモリのローカルバージョンを作成することは役に立ちません。関数から元のメモリの値を変更できるようにする必要があるためです。
2 回目にセグ フォールトが発生する理由がわかりません。アドバイスをいただければ幸いです。
どうもありがとう
ジョー