Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在字符串数组中指定字符C中的分段错误_C_String_Segmentation Fault - Fatal编程技术网

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

在字符串数组中指定字符C中的分段错误,c,string,segmentation-fault,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]); 感谢您的帮助我想您需要定义一个二维字符数组 为此,请执行以下步骤: 第一 定义指

我很困惑为什么我会被一个分割错误核心抛弃

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

感谢您的帮助

我想您需要定义一个二维字符数组

为此,请执行以下步骤:

第一 定义指针的字符**数组

char **splitStrings[bufSize];
第二 为行分配内存:

第三 为每一行的列分配内存

代码

进一步说明

有关二维动态阵列的详细信息,请参见 通过在C中使用malloc函数,永远不会强制转换它的结果 在中分配动态内存后,请不要忘记使用释放它

我建议您阅读更多关于如何使用函数在C中分配动态内存的内容

代码的最新版本

更改mallocbufSize*sizeofchar;mallocbufSize*sizeofchar*;这是分配内存的正确方法


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

我想您应该定义一个二维字符数组

为此,请执行以下步骤:

第一 定义指针的字符**数组

char **splitStrings[bufSize];
第二 为行分配内存:

第三 为每一行的列分配内存

代码

进一步说明

有关二维动态阵列的详细信息,请参见 通过在C中使用malloc函数,永远不会强制转换它的结果 在中分配动态内存后,请不要忘记使用释放它

我建议您阅读更多关于如何使用函数在C中分配动态内存的内容

代码的最新版本

更改mallocbufSize*sizeofchar;mallocbufSize*sizeofchar*;这是分配内存的正确方法


因为在第一种情况下,在SplitString指针上调用free会导致内存错误。为什么?你错过了一层声明。在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取消分配内存以避免内存泄漏。

您错过了一层声明。在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]);
char* splitStrings[bufSize]; //is expecting address, if it is derefencing directely will through segmentation fault.
阅读malloc是如何工作的,尤其是如何在完成后用free取消分配内存,以避免内存泄漏

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]);
}
我们有两个选择,一个是动态内存分配,否则声明如下

#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的常量int很好地使用了常量!,您已经创建了一个指向大小为32的字符数组的指针

让我们看下一行

splitStrings[0][0] = 'a';
现在,您尝试查看SplitString指向的数组中的第一项,然后查看该数组中的第一项。这就是你的细分错误

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

因此,当编译器试图完成这项工作时,它会说好的,让我们看看SplitString中的第一项!好的,这是一个指向角色的指针!现在,让我们看看该角色下的第一项!等等,等等。我还没有分配它,它还不允许有自己的数组!分割错误

要解决这个问题,您需要创建一个由数组组成的二维数组,并分配内存。Esmaele在他们的回答中就如何做到这一点给出了很好的指导。我还强烈推荐和上的教程点线段。该网站对于任何试图学习C编程语言的人来说都是一个极好的资源


我希望这有助于你更好地理解分割错误!请随时要求任何澄清

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

所以,让我们逐步浏览您的代码,看看发生了什么

const int buffsize = 32;
char* splitStrings[buffsize];
好的!到目前为止,您已经声明大小为32的常量int很好地使用了常量!,您已经创建了一个指向大小为32的字符数组的指针

让我们看下一行

splitStrings[0][0] = 'a';
现在,您尝试查看SplitString指向的数组中的第一项,然后查看该数组中的第一项。这就是你的细分错误

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

因此,当编译器试图完成这项工作时,它会说好的,让我们看看SplitString中的第一项!好的,这是一个指向角色的指针!现在,让我们看看该角色下的第一项!等等,等等。我还没有分配它,它还不允许有自己的数组!分割错误

要解决这个问题,您需要创建一个由数组组成的二维数组,并分配内存。Esmaele在他们的回答中就如何做到这一点给出了很好的指导。我还强烈推荐和上的教程点线段。该网站对于任何试图学习C编程语言的人来说都是一个极好的资源


我希望这有助于你更好地理解分割错误!请随时要求任何澄清

您声明了一个包含32个字符*s的列表。他们所指的是未定义的。malloc是你的朋友。阿门,malloc,谢谢你,伙计。你声明了一个32个字符的列表。他们所指的是未定义的。马洛克是你的朋友。阿门,马洛克,谢谢你,盖伊。我相信OP在C方面仍然是一个乞丐,考虑到问题的内容,我想他在没有任何解释或评论的情况下理解这个答案会有很多困难。我相信OP在C方面仍然是一个乞丐,考虑到问题的内容,我认为他在没有任何解释或评论的情况下理解这个答案会有很多困难;因为根据定义sizeofchar将始终==1,所以您的语句可以简化为…malloc2;