【问题标题】:Problem with C pointers in 2d char arrays二维字符数组中的 C 指针问题
【发布时间】:2011-10-28 12:25:01
【问题描述】:

为什么会这样:

    //split returns (char**)
    char *temp2;
    temp2=split(array[i],'=')[1];

这不是:

char **temps;
temps[0]=temp2; //crashes

或者这个:

temps[0]=split(array[i],'=')[1]; //crashes

【问题讨论】:

  • 哇,57 秒内有 6 个答案。

标签: c arrays pointers char 2d


【解决方案1】:

temps 只是一个指向char* 的指针,但它没有初始化的、合理的值! temps[0] 等价于 *(temps + 0),但你不能取消引用垃圾值——你首先必须使 temps 指向有用的地方,例如通过为其分配内存。

如果你想用自动存储来存储一些char*s,然后声明一个字符指针数组来代替:

char * temps[20];
temps[0] = /*... etc. ...*/

【讨论】:

    【解决方案2】:

    Split 返回一个指向一个字符的指针。因此,split(array[i],'=')[1] 返回的是一个 指向 char 的指针,这是您在堆栈上声明的内容,因此为它保留了空间。这就是它起作用的原因。

    其他两个不起作用,因为指向的空间没有分配。你应该使用 malloc()。

    【讨论】:

      【解决方案3】:

      如果你只是声明一个指针变量:

      char **temps;
      

      它并没有真正指向某个地方。嗯,它实际上是,但这可能是垃圾(内存中的任何地方)。您必须在使用它之前对其进行初始化。尝试为其分配空间。

      【讨论】:

        【解决方案4】:

        char **temps 从未分配任何空间。您正在使用 temps[0] 解除对坏记忆的引用。

        【讨论】:

          【解决方案5】:

          人 malloc()

          你必须分配你的内存来获得空间!

          【讨论】:

            【解决方案6】:
            char **temps;
            temps[0]=temp2; //crashes
            

            指针 temps 未初始化。取消引用它是一个未定义的操作。

            【讨论】:

              【解决方案7】:

              因为 temps 没有初始化。它是一个指向随机内存位置的随机值。

              【讨论】:

                【解决方案8】:

                这样想:

                char *temp2 = "foo";
                
                char **temps;
                
                temps[0] = temp2; // won't work
                temps = &temp2; // ok
                

                temp2 指向一个 C 字符串。您可以将 temps 指向 temp2, (&temp2) 的地址,但不能取消引用 temps(即 temps[0]),除非您首先使其指向有效的东西。从您的问题来看,您似乎想先 malloc() 一个 char* 数组。

                在第二种和第三种情况下,您取消引用 temps[0] 而不首先使其引用某个有效的内存位置。正如已经指出的那样, temps 指向一个垃圾位置。

                您的第一个案例有效,因为您取消了对 split() 的引用,所以它给了您一个 char*。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-12-18
                  • 2017-04-26
                  • 1970-01-01
                  • 2017-06-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多