'\ 0'和0之间的区别用于终止字符串

时间:2018-02-01 10:14:57

标签: android c++ android-ndk java-native-interface

我正在使用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上报告。

2 个答案:

答案 0 :(得分:2)

你的问题和问题无关 - 让我回答你的问题...... 你的崩溃是因为NewStringUTF没有复制它的参数;你有责任在java字符串的生命周期内保持内存有效。

但是你提供了一个局部变量作为指针,它留下了范围;将访问权限视为未定义的行为。

答案 1 :(得分:0)

  

任何人都可以解释两者之间的区别吗?

在作业中:

s[len] = '\0';

'\0'char 文字常量

并在作业中:

s[len] = 0;

0int 文字常量。由于此int已分配给char,因此将转换转换为chars声明为char s[len + 1])。转化结果与'\0'具有相同的值。也就是说,在分配之后,评估条件:

s[len] == '\0'

产生真实。

在这种情况下,使用哪一个并不重要,但我建议您坚持使用s[len] = '\0'形式明确指出char正在分配的内容。