更改结构数组元素中的值

时间:2013-10-10 20:55:54

标签: c arrays pointers

我正在完成一项任务并遇到了具有挑战性的问题。就我而言,根据我所学到的,后面的代码应该是正确的,但它不起作用。基本上我正在尝试将字符串值复制到结构的变量成员中,该结构是作为指针传递给方法的数组的一部分。我错过了什么?

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的新手

3 个答案:

答案 0 :(得分:2)

两个问题:

  1. while(i++ < 2)此行在检查后会立即更改i的值,因此您的循环体不会与检查时相同。
  2. 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;
}