Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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

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_Parsing_Malloc_Arrayofstring - Fatal编程技术网

C 将字符串数组分配给另一个字符串数组

C 将字符串数组分配给另一个字符串数组,c,string,parsing,malloc,arrayofstring,C,String,Parsing,Malloc,Arrayofstring,我试图解析一个C字符串数组,将一部分单词分配给一个字符串数组,另一部分分配给另一个数组。但是当我使用strcpy函数时,我得到了segfault。你知道怎么解决这个问题吗 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char **one = malloc(

我试图解析一个C字符串数组,将一部分单词分配给一个字符串数组,另一部分分配给另一个数组。但是当我使用strcpy函数时,我得到了segfault。你知道怎么解决这个问题吗

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])  {
    char **one = malloc(16 * sizeof(char*));
    char **two = malloc(32 * sizeof(char*));

    one[0] = "string";

    strcpy(two[0], one[0]);

    printf("%s\n", two[0]);
}
编译并运行该命令后,我得到了segfault。

数组2在malloc之后保留32个字符指针的空间。 但是,这些指针未初始化,此时不指向有效的已分配内存

因此,strcpy实际上有一个目的地2[0],它是一些未知的、未初始化的值。指针本质上是存储在内存中的值。在本例中,值为grabage

由于非法内存访问,strcpy对垃圾地址的写入会生成SEGFAULT

要解决此问题,请确保目标2[0]指向合法的可写缓冲区,可能是2[0]=malloc128*sizeofchar


在相关说明中,查找类似但更安全的函数strncpy。

您还需要将一个字符数组分配给两个[0]。我得到segfault。你知道怎么解决这个问题吗这个问题总是导致一种一致的故障排除方法:在调试器中运行程序。本例中的代码问题非常简单,但问题的叠加主题远远不止于此。您还可以执行两个[0]=1[0],不复制字符,但将两个[0]设置为有效地址。@WhozCraig您说得对,尽管我在gdb中运行了它,并阅读了strcpy的手册页,我发现的唯一一件事是目标应该比源大。但我可以说我在编程方面没有经验,所以这也起到了一定的作用。@sercantor非常感谢您使用了调试器。将来,您所做的任何调试工作以及迄今为止所了解/总结的信息都应该成为您的问题的一部分。这很重要。它节省了人们的时间。在这种情况下,答案显然很简单,实际上并不那么简单。但在更复杂的代码中,它可能非常有用。请在以后的帖子中记住这一点。谢谢你的澄清,这完美地解释了我的问题。