在C中的字符串分割错误数组中分配字符

时间:2018-11-21 12:26:32

标签: c string segmentation-fault

对于为什么我遇到“分段错误(核心已转储)”感到非常困惑。

const int bufSize = 32;
char* splitStrings[bufSize];
splitStrings[0][0] = 'a';
splitStrings[0][1] = '\0';
printf("testchar: %c",splitStrings[0][0]);
printf("teststr: %s",splitStrings[0]);

感谢您的帮助

4 个答案:

答案 0 :(得分:3)

您错过了一层声明。您在char splitStrings上有一个指针表。然后,您需要预订一些内存空间并使用指针指向它。这是第一个指针的示例:

splitStrings[0] = malloc(2*sizeof(char));
splitStrings[0][0] = 'a';
splitStrings[0][1] = '\0';
printf("testchar: %c",splitStrings[0][0]);
printf("teststr: %s",splitStrings[0]);

阅读malloc的工作方式,尤其是完成后如何使用free释放内存,以避免内存泄漏。

答案 1 :(得分:2)

我建议您阅读有关如何使用malloc()函数在C中分配动态内存的更多信息。

我认为您想定义一个二维char数组。为此,请执行以下步骤:

第一

定义一个char**指针。 char **splitStrings[bufSize];

第二

为行splitStrings = malloc(bufSize*sizeof(char));

分配内存

最后

为每一行为其列分配内存。

for (int i=0;i<bufSize;i++){ splitStrings[i]=malloc(bufSize*sizeof(char)); }


代码

#include <stdio.h>///for printf()
#include <stdlib.h>///for malloc()

int main(){

    const int bufSize = 32;
    char **splitStrings;

    splitStrings = malloc(bufSize*sizeof(char*));

    for (int i=0;i<bufSize;i++){
        splitStrings[i]=malloc(bufSize*sizeof(char*));
    }

    splitStrings[0][0] = 'a';
    splitStrings[0][1] = '\0';

    printf("testchar: %c\n", splitStrings[0][0]);
    printf("teststr: %s\n", splitStrings[0]);

    free(splitStrings);

}

其他说明

  • 有关二维动态数组see
  • 的更多信息
  • 通过在C语言中使用malloc()函数,永远不会转换其结果see
  • Heap中分配动态内存后,请不要忘记使用free()释放动态内存。

最新版代码

malloc(bufSize*sizeof(char));更改为malloc(bufSize*sizeof(char*));,这是分配内存的正确方法

因为在第一种情况下,在free()指针上调用splitStrings会导致内存错误。 为什么?

答案 2 :(得分:1)

char* splitStrings[bufSize]; //is expecting address, if it is derefencing directely will through segmentation fault.

我们有两个选择,一个是动态内存分配,否则像下面这样声明。

#include<stdio.h>
void main()
{
    const int bufSize = 32;
    char splitStrings[1][bufSize];
    splitStrings[0][0] = 'a';
    splitStrings[0][1] = '\0';
    printf("testchar: %c",splitStrings[0][0]);
    printf("teststr: %s",splitStrings[0]);
}

答案 3 :(得分:1)

其他人已经回答了如何解决该错误,因此我不会再赘述。相反,我将回答为什么您会遇到细分错误的问题。

所以,让我们逐步检查代码,看看发生了什么!

const int buffsize = 32;
char* splitStrings[buffsize];

好的!到目前为止,您已经声明了一个大小为32的const int(很好地使用const btw!),并且创建了一个指向大小为32的字符数组的指针!

所以让我们看下一行!

splitStrings[0][0] = 'a';

因此,现在,您尝试查看splitStrings指向的数组中的第一项,然后查看该数组中的第一项。这就是您遇到细分错误的地方!

在C中,当某些东西试图访问不允许访问的内存时,发生分段错误。在这种情况下,可以访问splitStrings [0],但不能访问splitStrings [0] [0]。这是因为您当前在splitStrings [0]处没有数组-相反,您只有一个未分配的指向字符的指针。

因此,当编译器尝试解决该问题时,它说:“好的,让我们看一下splitStrings中的第一项!好吧,这是指向字符的指针!现在,让我们看一下该字符下的第一项! -等一下,等等。我还没有分配它,还不能拥有自己的数组!分段错误!“

要解决此问题,您将需要创建2D数组(即数组的数组)并分配该内存。 EsmaeelE在其答案here中给出了有关如何执行此操作的良好说明。我也强烈推荐multi-dimensional arraysarrays of pointers上的TutorialsPoint段。对于试图学习C编程语言的人来说,该网站是一个极好的资源!

希望能帮助您更好地了解细分错误!随时要求任何澄清!