在C ++中进行转换的结果是什么?

时间:2014-12-05 15:21:23

标签: c++ c arrays

我遇到了下一个情况:

char *arr[] = {"hello", (char *) 0};

上面将创建一个char指针数组,arr[0]将指向“hello”字符串的第一个字符。但是,在这种情况下(char *) 0是什么以及它可以在何处使用?

当我尝试拨打arr[1]时,它会给我下一个错误:

  

segmentation fault (core dumped)

编辑:我在创建posix_spawn函数的argv参数时使用它(它需要在最后一个位置有一个空指针):

  

The argument argv is an array of character pointers to null-terminated strings. The last member of this array shall be a null pointer and is not counted in argc.

2 个答案:

答案 0 :(得分:5)

在此上下文中,0空指针常量。它可以在有或没有强制转换的情况下转换为任何指针类型,从而提供该类型的空指针。在现代C ++中,您可以编写nullptr来更清楚地表示您指的是空指针,而不是数字零。为了同样的目的,还有一个NULL宏。

所以这里有两个指针:一个指向字符串文字的字符数组,另一个指向null,并且不指向任何内容。

取消引用空指针会给出未定义的行为;通常是您遇到的分段错误。

请注意,在现代C ++中,您需要const char *才能指向常量字符串文字"hello"。较旧版本的语言允许危险转换为非const char *,以便与没有const概念的古代C代码兼容;现在终于从语言中删除了那种肮脏。

答案 1 :(得分:2)

arr [1]是一个空指针,一个值为0的指针。在指针未指向有效对象的情况下使用它。例如,链接列表中最后一个节点的下一个指针。访问空指针会导致未定义的行为,并且通常会出现分段错误。