Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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/3/arrays/13.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
无法确定节点中字符串数组的malloc参数_C_Arrays_Pointers_Nodes - Fatal编程技术网

无法确定节点中字符串数组的malloc参数

无法确定节点中字符串数组的malloc参数,c,arrays,pointers,nodes,C,Arrays,Pointers,Nodes,我花了很长时间才弄明白如何为节点中字符串数组中的每个字符串分配内存,如下所示: typedef struct node { char args[10][20]; struct node *previous; struct node *next; } Node; Node * createNode(void) { Node *newNode; newNode = malloc(sizeof(Node)); int i; for(i = 0;

我花了很长时间才弄明白如何为节点中字符串数组中的每个字符串分配内存,如下所示:

typedef struct node {
    char args[10][20];
    struct node *previous;
    struct node *next;
} Node;

Node * createNode(void) {
    Node *newNode;
    newNode = malloc(sizeof(Node));
    int i;
    for(i = 0; i < 10; i++) {
        newNode->args[i] = (char *) malloc(sizeof(char));
    }
    return newNode;
}
类似地,当我尝试
malloc(sizeof(char*))
时,我收到了以下错误:

error: incompatible types when assigning to type ‘char[20]’ from type ‘char *’
   newNode->args[i] = (char *) malloc(sizeof(char *));

我原以为我已经开始理解C语言中的指针,但现在我非常困惑。非常感谢您的帮助。

因为您已经在中为args分配了内存

char args[10][20]
它在为其重新分配内存时抛出错误

您可以改为:

char **args
然后使用malloc分配内存:

newNode->args = (char**)malloc(sizeof(*char)*10)
for(i = 0; i < 10; i++) {
    newNode->args[i] = (char *) malloc(sizeof(char)*20);
}
newNode->args=(char**)malloc(sizeof(*char)*10)
对于(i=0;i<10;i++){
newNode->args[i]=(char*)malloc(sizeof(char)*20);
}

假设您需要20个字符串的大小。

尝试在此处给出答案,首先可能需要澄清一件事:

数组不是指针

这是一个非常常见的误解,因为数组在用作函数参数时会作为指针自动衰减,并且可以隐式转换为指针。但情况还是不一样


鉴于此,看看你的结构。这里没有指向
char
的指针。不需要为
args
分配任何内容,因为您的
struct节点已经为成员
args
分配了
10*20
字节的空间
args

您不需要为char[10][20]分配内存。因为这意味着您已经有足够的内存分配给10个字符数组,每个数组的大小为20。在任何情况下,
malloc(sizeof(char))
都会分配一个字节的内存。并且不要在C中强制转换
malloc
&friends的结果!实际上,在这种情况下仍然会生成错误,但在C中,从
malloc
转换返回可以隐藏错误。请说明如何隐藏错误,因为OP的代码尝试中从未包含字符串长度。并且。。。为什么?如果你确实想要固定大小的字符串,单独分配它们只是浪费资源。顺便说一句,你的措辞是如此的不准确,这显然是错误的<代码>字符参数[10][20]
在OP的代码中不分配任何内容,它声明一个成员,并在分配包含的结构时分配。重新分配是不被禁止的,但是你不能分配一个2d数组的“行”(因为它不是指针),并且通常你不能重新分配一个动态分配的对象的一部分。我更喜欢
如果((newNode->args[I]=malloc(20))==NULL){…}
这是三个正确答案。。我只是对问题中的错误作了解释。。但是为了显式地使用malloc。。args可以完全声明为数组的指针(**args)
newNode->args = (char**)malloc(sizeof(*char)*10)
for(i = 0; i < 10; i++) {
    newNode->args[i] = (char *) malloc(sizeof(char)*20);
}