2017-04-18 93 views
1

我試圖在c中的5x5二維char *數組中替換一個字符串值。我設法將正確位置的值替換,但由於某種原因,數組中的替換字符總是「p」,而不是所需的字符。我曾嘗試使用strcpy()和strcat()作爲分配值的替代方法,遺憾的是這兩種方法導致了分段錯誤。任何建議將不勝感激。代碼如下所示。在二維char *數組中取代字符串值c/java jni

有問題的二維數組是這樣的:

char *map[5][5] = { 
       {".", ".", ".", ".", "."}, 
       {".", ".", ".", ".", "."}, 
       {".", ".", "G", ".", "."}, 
       {".", ".", ".", ".", "."}, 
       {".", ".", ".", ".", "."} }; 

而且方法,我用在特定的位置來改變性格:

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
      char tileChar = (char)tile; 
      map[y][x] = &tileChar; 
    } 

將瓷磚從一個Java類傳入。

+1

爲什麼'*的char [] []',而不是'的char [] []' – Sniper

+0

1.我看到的問題是,您使用的是指針的指針的指針:字符*地圖[5] [5]。 2.你想要C代碼,但你使用的是JNDI,爲什麼? – moldovean

回答

0

在C中,map[y][x] = &tileChar;是錯誤代碼作爲一次函數結束時,map[y][x]包含無效指針

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x] = &tileChar; // BAD 
} 

初始化map,而不是一個指針,而是作爲char[2]

的5×5陣列
char map[5][5][2] = { 
      {".", ".", ".", ".", "."}, 
      {".", ".", ".", ".", "."}, 
      {".", ".", "G", ".", "."}, 
      {".", ".", ".", ".", "."}, 
      {".", ".", ".", ".", "."} }; 

然後簡單地分配第一個char

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x][0] = tileChar; 
} 

Alliteratively,只是使用的char@Sniper的5×5陣列。這將影響OP的代碼的其餘部分。

char map[5][5] = { 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', 'G', '.', '.'}, 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', '.', '.', '.'} }; 

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x] = tileChar; 
} 
0

你正在傳遞tileChar的地址,我想你想通過 這個char本身。

map[y][x] = tileChar; 

編輯:沒有注意到這是一個指針數組,忽略了我上面說的。

您正在堆棧中創建一個char,所以當您從函數返回時,指向您創建的char的指針不再有效。你將需要在堆中創建char。

+0

沒有。它是指針數組 – Sniper

+1

在堆中聲明tileChar完美工作。謝謝! – edwardam