对于为什么我遇到“分段错误(核心已转储)”感到非常困惑。
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]);
感谢您的帮助
答案 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);
}
其他说明
最新版代码
将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 arrays和arrays of pointers上的TutorialsPoint段。对于试图学习C编程语言的人来说,该网站是一个极好的资源!
希望能帮助您更好地了解细分错误!随时要求任何澄清!