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

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

これはあなたの質問に直接答えているわけではありませんが、コメントに入れるために大きな問題に対処しています...
追加の問題: おそらく、少なくとも "名前"。変化する;

arr[i].name = malloc(sizeof(char *));

に:

arr[i].name = malloc(sizeof(char)*strlen("name")+1); // '\0' の場合は +1

またはさらに良いことに、を使用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 によってほのめかされたが、実際には説明されていない、もう 1 つのことに対処したかったのですが、それはあなたにとって役立つかもしれないと思います
: (ただし、使用した名前を 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 に答える