Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;特定编译器/平台问题上以null结尾的字符串_C++_String - Fatal编程技术网

C++ C++;特定编译器/平台问题上以null结尾的字符串

C++ C++;特定编译器/平台问题上以null结尾的字符串,c++,string,C++,String,我发现一些代码如下(以下代码中有许多问题): //每个错误代码示例中的设置都是一致的 字符串;字符串; char*nullValue=getenv(“不存在”);//一些不存在的环境变量 //错误代码示例1: 字符x[1024]; sprintf(x,“某些文本%s”,空值)//solaris上的崩溃,linux呢? //错误代码示例2: someString+=nullValue;//这里发生了什么? //错误代码示例3: someString.append(null值);//这里发生了什么?

我发现一些代码如下(以下代码中有许多问题):

//每个错误代码示例中的设置都是一致的
字符串;字符串;
char*nullValue=getenv(“不存在”);//一些不存在的环境变量
//错误代码示例1:
字符x[1024];
sprintf(x,“某些文本%s”,空值)//solaris上的崩溃,linux呢?
//错误代码示例2:
someString+=nullValue;//这里发生了什么?
//错误代码示例3:
someString.append(null值);//这里发生了什么?
//错误代码示例4:
字符串nextString=字符串(空值)//这里发生了什么?

cout在不首先检查返回值的情况下,从指针构造字符串时出现问题。
getenv
的定义是:

检索包含名称指定为参数的环境变量值的C字符串。如果请求的变量不是环境列表的一部分,则函数返回空指针

从C++指针中明确地不允许从NULL指针创建<代码> STD::String 。追加到字符串(

+=
)也是如此


我不是C专家,但我有一种预感,即不允许将空指针与
sprintf
一起使用。

在不首先检查返回值的情况下,从指针构造字符串会出现问题。
getenv
的定义是:

检索包含名称指定为参数的环境变量值的C字符串。如果请求的变量不是环境列表的一部分,则函数返回空指针

从C++指针中明确地不允许从NULL指针创建<代码> STD::String 。追加到字符串(

+=
)也是如此


我不是C方面的专家,但我有一种预感,在sprintf中使用null指针也是不允许的。

一般来说,在需要有效C字符串的地方使用null会导致未定义的行为,这意味着任何事情都可能发生。 一些平台试图为此定义行为。IIRC有一些平台可以优雅地将空指针传递给printf系列函数以进行%s格式替换(打印类似于“(NULL)”的内容)。除此之外,一些平台试图确保此类情况下的再现性碰撞(例如致命信号)。但你不能总的依赖这个


若您在代码的这一方面有问题:是的,这是一个可能的原因,或者可能掩盖了其他原因,所以:修复它,它就坏了

通常,如果使用NULL,则会导致未定义的行为,这意味着任何事情都可能发生。 一些平台试图为此定义行为。IIRC有一些平台可以优雅地将空指针传递给printf系列函数以进行%s格式替换(打印类似于“(NULL)”的内容)。除此之外,一些平台试图确保此类情况下的再现性碰撞(例如致命信号)。但你不能总的依赖这个


若您在代码的这一方面有问题:是的,这是一个可能的原因,或者可能掩盖了其他原因,所以:修复它,它就坏了

在您描述的任何情况下使用空指针时,确切地说是“未定义的行为”。有些C库确实能识别printf中字符串的NULL,并会打印“(NULL)”或类似的内容,但我绝对不会依赖于此。类似地,NULL的其他用法是“未定义的”,这意味着它们保证不会以任何特定方式跨一系列平台工作。在一个平台上发生的事情很可能与在另一个平台上发生的事情完全不同(或者使用另一个品牌/版本的编译器,或者使用不同的编译器优化设置,或者如果你运气不好,那天的风向也会不同)。在这种情况下,它很可能导致崩溃或“行为良好的代码”——这取决于谁编写了C/C++库


一种解决方案是,如果您有以下几种方法,则创建一个“getenv_safe”,如果未设置环境变量,它将返回空字符串[或“not set”或类似值],然后直接修复代码,或定义getenv(x)getenv_safe(x)

在您描述的任何情况下使用空指针时,确切地说是“未定义的行为”。有些C库确实能识别printf中字符串的NULL,并会打印“(NULL)”或类似的内容,但我绝对不会依赖于此。类似地,NULL的其他用法是“未定义的”,这意味着它们保证不会以任何特定方式跨一系列平台工作。在一个平台上发生的事情很可能与在另一个平台上发生的事情完全不同(或者使用另一个品牌/版本的编译器,或者使用不同的编译器优化设置,或者如果你运气不好,那天的风向也会不同)。在这种情况下,它很可能导致崩溃或“行为良好的代码”——这取决于谁编写了C/C++库


一种解决方案是,如果您有以下几种方法,则创建一个“getenv_safe”,如果未设置环境变量,它将返回空字符串[或“not set”或类似值],然后直接修复代码,或定义getenv(x)getenv_safe(x)

sprintf
调用看起来很奇怪,不应该有
%s
吗?@J.N.你说得对,我把它修好了。@Dale:请发布一些真实的东西
x
没有在该代码中使用,因此sprintf是毫无意义和令人困惑的。并描述您的实际问题。@Mat在使用sunstudio编译后运行sprintf时会立即崩溃,这实际上是我对上述代码最不感兴趣的问题——我希望它到处都会崩溃(但找不到说明这一点的文档)。如果sprintf是问题所在,为什么要将所有这些字符串编码为
//setup consistent in each of the bad code examples
string someString; 
char* nullValue = getenv("NONEXISTENT"); // some non-existent environment variable  

// bad code example 1:
char x[1024];
sprintf(x," some text%s ", nullValue); //crashes on solaris, what about linux?  

// bad code example 2: 
someString += nullValue; // What happens here?  

//bad code example 3:
someString.append(nullValue); // What happens here?  

//bad code example 4:
string nextString=string(nullValue); //What happens here?
cout<<nextString;