Seg故障双指针,正确的Malloced(我相信)

Seg故障双指针,正确的Malloced(我相信),c,C,好的,这里有一些关于我想要达到的目标的概述。我希望用户能够输入任意数量的字符串,然后我希望将这些字符串保存在双字符指针中。目前,我还没有为双字符指针扩展内存分配,因为我想先让它工作 char **list = malloc(sizeof(char*)*5); for(i = 1; i < argc; i++) { strcpy(list[i], argv[i]); } char**list=malloc(sizeof(char*)*5); 对于(i=1;i

好的,这里有一些关于我想要达到的目标的概述。我希望用户能够输入任意数量的字符串,然后我希望将这些字符串保存在双字符指针中。目前,我还没有为双字符指针扩展内存分配,因为我想先让它工作

char **list = malloc(sizeof(char*)*5);

for(i = 1; i < argc; i++) {
        strcpy(list[i], argv[i]);
}
char**list=malloc(sizeof(char*)*5);
对于(i=1;i

我真的以为这会很简单,所以希望我犯了一些愚蠢的错误。我一直在strcpy函数中收到seg fault错误。

您已经为字符串分配了一个指针数组,但没有为字符串本身分配任何空间。每次调用strcpy()
时,都会传递一个未初始化的目标指针。在循环的开头添加一行:

list[i] = malloc(strlen(argv[i]) + 1);
如果希望它适用于任意数量的字符串,则初始分配必须为:

char **list = malloc(sizeof(char *) * argc);

它没有正确的malloced您只malloced主指针,而不是其他指针

试试这个

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char **argv) {
    char **list = malloc(sizeof(char*)*argc);
    int i;    
    for(i = 0; i < argc-1; i++) {
       list[i] = malloc(sizeof(char) * (strlen(argv[i+1]) + 1));
       strcpy(list[i], argv[i+1]);
       printf("%s\n", list[i]);
    }
return 0;
}

您所做的只是为指向字符串的指针数组分配内存(这是正确的),但还需要为数组中的每个字符串分配内存:

第一个(更简单)选项:

char**list=malloc(sizeof(char*)*argc);
对于(i=1;i
第二个(更复杂)选项:

size\u t n=0;
char**list=malloc(sizeof(char*)*argc);
对于(i=1;i
为指针分配了空间,但没有为指针分配指向的空间,也没有将指针设置为指向未分配的空间。
sizeof(char)
为1。为什么要费心去写呢?如果你明白这一点,那么你就不必费心了,但是从他的帖子中你可以清楚地看到,他还不懂C语言的很多东西,所以我的意图很清楚(呃)。我的感觉正好相反,使用
sizeof(char)
表示对语言的工作方式缺乏了解。@Carl Norum:这根本不是语言的问题,可能是平台的问题。C标准没有指定sizeof(char)始终为1,但它指定了它必须能够存储的值的范围。有些平台的sizeof(char)不是一个。(至少有一篇关于它的帖子)我相信使用sizeof(char)是一种很好的做法…只要我的两分钱。当所有不同级别的程序员都在阅读代码时,指定char而不是1会使事情更清楚。否则像我这样的人不会明白1是从哪里来的。虽然我可以看出,通过向经验不足的程序员解释每一个细微差别而不是编写简洁的代码,这可能会吸引一个人的自尊心。现在我在列表[I]malloc位置进行seg故障。您的SEGFULT在malloc或strcpy上的位置在哪里。你指定了args吗?我刚刚编写了这个方法,它可以工作。我会把我所有的东西都贴出来
./temp hello this is a list of arguments
hello
this
is
a
list
of
arguments
char **list = malloc(sizeof(char*) * argc);
for(i = 1; i < argc; i++)
{
    list[i] = strdup(argv[i]);
}
size_t n = 0;
char **list = malloc(sizeof(char*) * argc);
for(i = 1; i < argc; i++)
{
    n = strlen(argv[i]) + 1;
    list[i] = malloc(n);
    strcpy(list[i],argv[i]));
}