2013-10-10 31 views
0

我正在处理任务并遇到具有挑战性的问题。就我而言,从我所了解的情况来看,后面的代码应该是正确的,但它不起作用。基本上我想要的是将一个字符串值复制到一个结构的变量成员中,该结构是作为指针传递给方法的数组的一部分。我错过了什么?更改结构数组元素中的值

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语言

+1

'typedef结构Struct'是一个非常,非常*,* ***非常糟糕想法*** – 2013-10-10 20:58:25

+0

我使用“结构”只是为了使它在阅读时明显表明我正在使用指针作为结构数组 – etienz

+0

1.数组的基本类型是不相关的。但是从声明中可以看出,这是一小段代码。 3.如果你想使它明确无误,那么不要typedef,并使用'struct Foo array [100];'中的'struct'关键字。不要造成混淆。请稍等。 – 2013-10-10 21:01:45

回答

2

两个问题:

  1. while(i++ < 2)这条线,只要它会检查它改变了i价值,让您的循环体是不一样的,因为它进行了调查。
  2. arr[i].name = strdup("name");覆盖.name指针的值,导致内存泄漏,您之前编辑的内存为malloc()
-1

这不是直接回答你的问题,但解决的问题,以大投入评论...
其他问题:你可能不打算仅分配(字符*)的价值记忆到一个至少要保存“名字”的变量。更改;

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

现在,您可以根据someInputString的长度分配name到任何需要的长度。

[编辑] Etienz,我想解决一两件事,通过上述@ H2CO3提到,但没有真正解释,我认为可能对你有用:
关于你渴望两个结构体的空间,因为你键入了你的结构体,你可以简单地做这样的事情:(但我会改变你使用的名字从Struct到NAME :) 整个观点是,当一个结构被创建为一个数组,你不需要使用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; 
} 
+1

sizeof(char)not sizeof(char *)。加1 –

+0

是的,重要的,错过了。谢谢 – ryyker

+0

仍然需要终结者的+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分配照顾自己