非常困惑为什么我会收到“分段错误(核心转储)”。
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]);
感谢您的帮助
您错过了一层声明。您有一个关于字符
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
取消分配内存以避免内存泄漏。
我认为你想定义一个二维字符数组。
为此,请执行以下步骤:
第一
定义一个
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
会导致内存错误。 为什么?
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]);
}
其他人已经回答了如何修复错误,所以我不再赘述。相反,我将回答为什么会出现分段错误的问题。
那么,让我们单步执行您的代码,看看发生了什么!
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 编程语言的人来说,该网站都是一个极好的资源!
我希望能帮助您更好地理解分段错误!如有任何疑问,请随时询问!