我正在完成一项任务并遇到了具有挑战性的问题。就我而言,根据我所学到的,后面的代码应该是正确的,但它不起作用。基本上我正在尝试将字符串值复制到结构的变量成员中,该结构是作为指针传递给方法的数组的一部分。我错过了什么?
typedef struct
{
char * name; //variable in struct I am trying to access
} Struct;
void foo(Struct * arr) //array of Structs passed into function as a pointer
{
int i = 0;
while(i++ < 2)
{
arr[i].name = malloc(sizeof(char *)); //assigning memory to variable in each Struct
arr[i].name = strdup("name"); //copying "name" to variable in each Struct
printf("C - %s\n", arr[i].name); //printing out name variable in each Struct
}
}
main()
{
Struct * arr; //defining pointer
arr = calloc(2, sizeof(Struct)); //allocating memory so pointer can hold 2 Structs
foo(arr); //calling function foo passing pointer into function
return 0;
}
此代码编译并运行,但它不会按照设计目的执行。如果它是微不足道的话,请原谅我。我是语言C的新手
答案 0 :(得分:2)
两个问题:
while(i++ < 2)
此行在检查后会立即更改i
的值,因此您的循环体不会与检查时相同。arr[i].name = strdup("name");
会覆盖.name
指针的值,导致您malloc()
之前记忆的内存泄漏。答案 1 :(得分:1)
已经正确地指出了2,
arr[i].name = strdup("name");
即使您使用以下代替上述内容,
strcpy(array[i].name, "name");
你没有分配足够的字节来存储字符串,即这是错误的
arr[i].name = malloc(sizeof(char *));
// even if pointer is 8 byte here, concept isn't right
应该像
arr[i].name = malloc(strlen("name")+1);
// or MAX_SIZE where it is greater than the possible "name".
或者更好的是,删除malloc,strdup负责分配
答案 2 :(得分:-1)
这不是直接回答你的问题,而是解决一个很大的问题,以便发表评论...... 附加问题:您可能不打算仅将(char *)内存值分配给至少要保留“name”的变量。更改;
arr[i].name = malloc(sizeof(char *));
到:
arr[i].name = malloc(sizeof(char)*strlen("name")+1);
// + 1代表'\ 0'
或者更好的是,使用char *name="name";
,然后:
arr[i].name = malloc(sizeof(char)*strlen(name)+1);
更普遍(也更好):
char *name;
name = malloc(strlen(someInputString)+1);
//do stuff with name...
free(name);
现在,您可以根据name
的长度将someInputString
分配到所需的任何长度。
的 [编辑] 强> 的
Etienz,我想解决另一件事,上面提到的@ H2CO3,但没有真正解释过,我认为可能对你有用:
关于你希望有两个结构的空间,因为你输入了你的结构,你可以简单地做这样的事情:(但我要把你从Struct使用的名称更改为NAME :) 整个点是当一个struct被创建为一个数组时,你不需要使用calloc或malloc来为它们创建空间,它如下所示完成...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char *name;
}NAME;
//use new variable type NAME to create global variables:
NAME n[2], *pN; //2 copies AND pointer created here
//prototype func
int func(NAME *a);
int main()
{
pN = &n[0]; //pointer initialized here
func(pN); //pointer used here (no malloc or calloc)
printf("name1 is %s\nname 2 is %s", pN[0].name, pN[1].name);
return 0;
}
int func(NAME *a)
{
char namme1[]="andrew";
char namme2[]="billebong";
//You DO have to allocate the members though
a[0].name = malloc(strlen(namme1)+1);
a[1].name = malloc(strlen(namme2)+1);
strcpy(a[0].name, namme1);
strcpy(a[1].name, namme2);
return 0;
}