我正在使用JNI代码生成随机字符串,并使用下面的代码将其返回给调用函数。
static const char alphanum[] =
"abcdefghijklmnopqrstuvwxyz";
jstring Utils::getRandomString(JNIEnv *env, const int len) {
char s[len + 1];
for (int i = 0; i < len; ++i) {
int p = rand() % (sizeof(alphanum) - 1);
s[i] = alphanum[p];
}
s[len] = 0;
return env->NewStringUTF(s);
}
我对如何在JNI中终止字符串感到困惑,我已经看到有两种方法
s[len] = 0;
和
s[len] = '\0'
任何人都可以解释两者之间的区别吗?哪一个适合JNI代码?识别这个东西的原因是应用程序在添加s[len] = '\0'
后s[len] = 0;
正常工作时崩溃了。
我无法生成此崩溃,但已在结构控制台http://crashes.to/s/2e4bca9a62c上报告。
答案 0 :(得分:2)
你的问题和问题无关 - 让我回答你的问题...... 你的崩溃是因为NewStringUTF没有复制它的参数;你有责任在java字符串的生命周期内保持内存有效。
但是你提供了一个局部变量作为指针,它留下了范围;将访问权限视为未定义的行为。
答案 1 :(得分:0)
任何人都可以解释两者之间的区别吗?
在作业中:
s[len] = '\0';
'\0'
是char
文字常量。
并在作业中:
s[len] = 0;
0
是int
文字常量。由于此int
已分配给char
,因此将转换转换为char
(s
声明为char s[len + 1]
)。转化结果与'\0'
具有相同的值。也就是说,在分配之后,评估条件:
s[len] == '\0'
产生真实。
在这种情况下,使用哪一个并不重要,但我建议您坚持使用s[len] = '\0'
形式明确指出char
正在分配的内容。