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

问题描述 投票:0回答:4

非常困惑为什么我会收到“分段错误(核心转储)”。

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]);

感谢您的帮助

c string segmentation-fault
4个回答
3
投票

您错过了一层声明。您有一个关于字符

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
取消分配内存以避免内存泄漏。


2
投票

我认为你想定义一个二维字符数组。

为此,请执行以下步骤:

第一

定义一个

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(void){

    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);

    return 0;
}

进一步说明

  • 有关二维动态数组的更多信息参见

  • 使用C中的

    malloc()
    函数获取堆内存,不要强制转换结果see

  • Heap中分配动态内存后,永远不要忘记使用

    free()
    释放它。

  • 我建议您阅读更多有关如何使用

    malloc()
    函数在 C 中分配动态内存的内容。

代码的最新版本

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

因为在第一种情况下,在

free()
指针上调用
splitStrings
会导致内存错误。 为什么?


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]);
}

1
投票

其他人已经回答了如何修复错误,所以我不再赘述。相反,我将回答为什么会出现分段错误的问题。

那么,让我们单步执行您的代码,看看发生了什么!

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

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

那么让我们看下一行!

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

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

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

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

要解决此问题,您需要创建一个 2D 数组(即数组的数组)并分配该内存。 EsmaeelE 在他们的回答here中给出了关于如何做到这一点的很好的说明。我还强烈推荐多维数组指针数组上的TutorialsPoint段。对于任何想要学习 C 编程语言的人来说,该网站都是一个极好的资源!

我希望能帮助您更好地理解分段错误!如有任何疑问,请随时询问!

© www.soinside.com 2019 - 2024. All rights reserved.