-4

我被卡住了,无法弄清楚为什么下面的代码没有运行。我对 c/c++ 相当陌生。

#include <iostream>
int main(){
    const char *arr="Hello";
    const char * arr1="World";

    char **arr2=NULL;
    arr2[0]=arr;
    arr2[1]=arr1;

    for (int i=0;i<=1;i++){
        std::cout<<arr2[i]<<std::endl;
    }
    return 0;
}

因为这运行得很好

#include <iostream>
int main(){

    const char *arr="Hello";
    const char * arr1="World";

    char *arr2[1];
    arr2[0]=arr;
    arr2[1]=arr1;

    for (int i=0;i<=1;i++){
        std::cout<<arr2[i]<<std::endl;
    }
    return 0;
} 

为什么是这样?并且通常如何迭代一个 char **?谢谢你

4

4 回答 4

3

char *arr2[1];是一个数组,其中包含一个类型为“char 指针”的元素(在堆栈上分配)。arr2[0]是该数组中的第一个元素。arr2[1]未定义。

char **arr2=NULL;是指向“char 指针”的指针。请注意,堆栈上没有分配内存。arr2[0]未定义。

最重要的是,您的两个版本都不正确。第二个变体“运行得非常好”只是一个提醒,错误的代码看起来可以正确运行,直到后来疏忽的编程真的了你,并且因为你破坏了堆栈而让你浪费了数小时和数天的调试时间。

编辑:代码中的进一步“罪行”:

  1. 字符串文字是 类型的char const *,你不要忘记const.
  2. 缩进函数代码是常见的(也是推荐的)做法。
  3. (恕我直言)在各个地方添加空格以提高可读性是(例如 post (、 pre )、 pre 和 post 二元运算符,;for语句中的 post 等)的好习惯。口味不同,并且有一个声音派别实际上鼓励尽可能地留出空间,但你甚至没有始终如一地这样做- 并且普遍推荐一致性。 尝试像astyle这样的代码重新格式化程序,看看它们可以为可读性做些什么。
于 2012-07-23T07:13:22.980 回答
1

这是不正确的,因为 arr2 没有指向任何东西:

char **arr2=NULL;
arr2[0]=arr;
arr2[1]=arr1;

正确方法:

char *arr2[2] = { NULL };
arr2[0]=arr;
arr2[1]=arr1;

这也是错误的,arr2 的大小为 1:

char *arr2[1];
arr2[0]=arr;
arr2[1]=arr1;

正确的方法是一样的:

char *arr2[2] = { NULL };
arr2[0]=arr;
arr2[1]=arr1;
于 2012-07-23T07:11:20.770 回答
1
char **arr2=NULL;

是指向指向 NULL 的指针的指针,而

char *arr2[1];

是一个指针数组,已经为两个项目分配了空间。

在指向指针的指针的第二种情况下,您正试图将数据写入不存在的内存位置,而首先编译器已经为数组分配了两个内存插槽,因此您可以将值分配给这两个元素。

如果您非常简单地考虑它,C 指针只不过是一个整数变量,其值实际上是一个内存地址。因此,通过定义char *x = NULL,您实际上是在定义一个值为 NULL(即零)的整数变量。现在假设你写了类似的东西*x = 5;这意味着转到存储在 x (NULL) 中的内存地址并在其中写入 5。由于没有地址为 0 的内存槽,所以整个语句都失败了。

老实说,自从我上次不得不处理这些东西以来已经有很多年了,但是这里的这个小教程可能会清除 C++ 中数组和指针的运动。

于 2012-07-23T07:25:59.820 回答
0

简单地说,指针的声明不会保留任何内存,而数组的声明则不会。

在您的第一个示例中,您的行 char **arr2=NULL 声明了一个指向字符指针的指针,但未将其设置为任何值 - 因此它被启动指向零字节(NULL==0)。当您说 arr2[0]=something 时,您正试图在这个不属于您的零位置放置一个值 - 因此崩溃。

在您的第二个示例中:声明 *arr2[2] 确实为两个指针保留了空间,因此它可以工作。

于 2012-07-23T07:13:12.383 回答