替换2D char * array c / java jni中的字符串值

时间:2017-04-18 14:37:23

标签: java c arrays string

我正在尝试用c替换5x5 2D char *数组中的字符串值。我已设法替换正确位置的值,但由于某种原因,数组中的替换字符始终为'p',而不是所需的字符。我已经尝试使用strcpy()和strcat()作为分配值的替代方法,遗憾的是,这两种方法会导致分段错误。任何建议将不胜感激。代码如下。

有问题的2D数组如下所示:

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;
    }

tile从Java类传递。

2 个答案:

答案 0 :(得分:0)

  

您正在传递tileChar的地址,我想您想通过   char本身。

map[y][x] = tileChar;

编辑:没有注意到它是一个指针数组,忽略我上面所说的。

您正在堆栈中创建一个char,因此当您从函数返回时,指向您创建的char的指针不再有效。你需要在堆中创建char。

答案 1 :(得分: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]的5x5数组

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;
}

只是使用char @Sniper的5x5数组。这会影响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;
}