我正在开发安卓系统。我有一个带指针参数的本机方法:

int writeData(unsigned char* readbuff, int length)

我想将值传递给readbuff指向的地址。我是这样做的:
int readData(unsigned char* readbuff, int length){//unsigned
   *readbuff = 'a';
   return 0;
    }

但它失败了:
Fatal signal 11 (SIGSEGV) at 0x74e9a36e (code=2), thread 14078 (Thread-1916)

我的问题是如何更改readbuff中的值?我找了很多,但还是找不到答案。请帮帮我!
非常感谢!
编辑:
这是我的新代码:
int readData(unsigned char* readbuff){
   JNIEnv *env;
   unsigned char* tmpbuff = "abc";
   if(readbuff==NULL||length < 4)
        __android_log_print(ANDROID_LOG_DEBUG, "error", "readbuff is null");
   else
       memcpy ( readbuff, tmpbuff, 3 );
}

现在该方法的调用方式如下:
void test(){
   unsigned char* readbuff = "this is jni";
       readData(readbuff);
}

但我还是犯了同样的错误。。。
请帮忙!
部分解决!
我试了很多,终于把应用程序运行起来了。我只是这样更改test():
void test(){
   unsigned char readbuff[11] = "this is jni"; //edit here
       readData(readbuff);
}

但是我不擅长C语言,谁能告诉我为什么readbuff[11]工作,但是*readbuff不工作?
谢谢你一次又一次!

最佳答案

两者的区别

unsigned char* readbuff = "this is jni";


unsigned char readbuff[11] = "this is jni";

是第一个指向字符串文本的字符串,不能对其进行修改。第二个是包含相同字符串的本地char数组,但是char数组可以自由修改。
但是,请注意数组对于一个字符来说太小了。它缺少最后一个NUL字节的空间。如果你想拥有一个数组,只要需要,你可以说
unsigned char readbuff[] = "this is jni";

更新:
要动态地执行相同的操作,可以执行
void test(){
    unsigned char* readbuff = malloc(256);
    readData(readbuff);
}

但你不能忘记最后的记忆。

09-26 15:25