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

4

3 回答 3

2

两个问题:

  1. while(i++ < 2)此行在检查时立即更改值i,因此您的循环体将与检查时不同。
  2. arr[i].name = strdup("name");覆盖.name指针的值,导致您之前使用的内存发生内存泄漏malloc()
于 2013-10-10T20:58:43.770 回答
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 自己负责分配

于 2013-10-10T21:11:26.783 回答
-1

这不是直接回答您的问题,而是解决了一个大问题以发表评论......
附加问题: 您可能不打算仅将 (char *) 的内存分配给旨在至少保存的变量“姓名”。改变;

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,您可以简单地执行以下操作:(但我要将您使用的名称从 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;
}
于 2013-10-10T21:09:50.870 回答