• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語 構造体)

C言語・構造体についての初歩的な質問

このQ&Aのポイント
  • C言語で構造体について疑問があります。ポインタの理解もまだできていません。
  • Windows7とVisual Studio 2010を使用して、WinAPIの勉強中にプログラムを作成しています。
  • 構造体Aのメンバnameに別の変数Bufの内容をコピーしたいのですが、ポインタの問題でうまくいきません。解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

if(data->name!=NULL)free(data->name); data->name=calloc(data->name, strlen(Buf) + 1, sizeof(char)); strcpy(data->name, Buf); ところで、data自体のmallocはやってますよね?

KabosuOrange
質問者

お礼

回答ありがとうございました。 構造体自体のmallocはしています。 コピーする前に領域を確保しなくてはいけなかったのですね。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

calloc じゃなくて malloc で十分だと思うし, その前の free も「NULL かどうかの判定」は不要だと思うの>#1.

KabosuOrange
質問者

お礼

ありがとうございました。 最小限のプログラムで無駄なく書けるようになりたいです。

KabosuOrange
質問者

補足

自分のプログラムではmallocで大丈夫でした。

全文を見る
すると、全ての回答が全文表示されます。
  • yhc3594
  • ベストアンサー率27% (25/92)
回答No.3

原因はきちんと整理できています。 ポインター変数を使うときはいろいろと注意が必要ですが、今回の場合は 単純に構造体を実態として定義すれば事足りると思います。 struct A{ fixed char name[128]; double i; } ご参考まで

KabosuOrange
質問者

お礼

回答ありがとうございました。 何とか目的のことはできました。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> 初歩の質問ですがお手柔らかに… > ポインタもまだ理解しきれていません。 それなら、まずポインタ(および、動的なメモリの確保と解放)の勉強を徹底的にやりましょう。 ポインタだけに絞った参考書とかもあります。 そうしないと、これからもたびたび質問しないとならない状況になりますよ。

KabosuOrange
質問者

お礼

おっしゃる通りです… ポインタだけの参考書はもっておりまして参考にしながら作っています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 list 構造体配列

    どうしてもこの問題がわからないので教えてください!  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • ポインタに含まれる情報は [C言語]

    ポインタに含まれる情報は代入した変数のアドレスですが、アドレス元の変数の大きさは含まれないのでしょうか?ポインタの中の情報を見てみても、参照できる変数が使用しているメモリの先頭アドレスしか入っていません。変数の大きさはどうやって知るのでしょか?回答よろしくお願いします。

  • C言語 構造体でつまずいています

    以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。  今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか? #include <stdio.h> #define MAX 50 //配列の要素数を定義 int count=0; //グローバル変数 struct data { //構造体の定義 int num; //メンバの宣言 int ten; }; void nyuryoku(struct data *); //プロトタイプ宣言 float heikin(struct data *); //プロトタイプ宣言 void main() { struct data score[MAX]; //構造体の宣言 printf("**学生番号/点数入力**\n"); printf("\n"); nyuryoku(score); //nyuryoku関数呼び出し printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score)); //heikin関数の戻り値表示 } //nyuryoku関数 //機能:構造体配列にデータを入力する void nyuryoku(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; for(i=0;i<MAX;i++){ printf("学生番号>>"); scanf("%d",&pd->num); if(pd->num==0){ //学生番号に0を入力するとループを抜ける break; } printf("点  数>>"); scanf("%d",&pd->ten); count++; //人数のカウント pd++; //構造体配列を一つずらす } } //heikin関数 //機能:構造体配列の点数の平均を計算、戻り値として返す float heikin(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; int sum=0; float ave=0; for(i=0;i<MAX;i++){ if(pd->num==0){ break; } else{ sum+=pd->ten; //点数を加算 pd++; } } ave=(float)sum/count; //平均値を求める return(ave); //平均値を戻り値として返す }

  • c言語で配列を返したい

    自分がc言語で書いているプログラムの関数で次のようなものがあるのですが、 int CTR(int data[], int* key, long long t){ int buf[sizeof(data)]; int tmp[16]; int bytesoft[128]; int i,j; KeyExpansion(key); for(i=0;i<sizeof(data);i+=16){ for(j=0;j<16;j++){ if(j<sizeof(bytesoft)) tmp[16-j-1]=bytesoft[sizeof(bytesoft)-j-1]; else tmp[16-j-1]=0; } Cipher(data); for(j=0;j<16;j++){ buf[i+j] ^= data[i+j]; } t=t+1; } return buf; } 配列bufを返すためには、ポインタを用いればいいということは調べて分かったのですが具体的にどのように書き換えればいいかよくわかりません。 どなたかご教授いただけないでしょうか?

  • 構造体

    構造体を受け取って、メンバの値を変数に代入する部分での質問です。 lParamには構造体のアドレスが入っています。 strcpy(buf, ((struct mpoint*)lParam)->r); これによって構造体のrメンバの文字列値をbufにコピーしたいのですが、文法が違うようなので正しく直したものを教えてください。

  • JavaでC言語のポインタ演算風な使い方は

    Java初心者です。ずっとC言語をやっていました。 Javaにはポインタは存在せず(実際は参照渡しなのでポインタその ものなのですが)、ポインタに対する演算はありませんよね。 C言語で、 int buf[2*10]; int *dst = buf; for(i=0;i<10;i++){ dst[0]=a; dst[1]=b; dst += 2; } のようなソースをJavaで書こうとすると、 for(i=0;i<10;i++){ buf[i*2+0]=a; buf[i*2+1]=b; } しか思いつきません。 コンパイルして最適化されれば問題ないと思いますが、 なんか配列中の演算が演算量をとりそうで、気になっています。 もっと高速に処理されるような書き方はないものでしょうか? アドバイスよろしくお願いします。

    • ベストアンサー
    • Java
  • 関数への構造体の配列の渡し方<c言語初心者>

    こんにちは、関数への構造体の配列の渡し方で理解できない点があるため、質問させていただきます。 以下がスクリプトになります。3人の名前と年齢をinput関数で入力し、それらのデータをoutput関数で出力するのが目的です。 #include <stdio.h> typedef struct{ char name[64]; int age; }property; void input(property *data[]); void output(property *data[]); int main(void){ property data[3]; printf("Input data of three people.\n"); input(&data); output(&data); return 0; } void input(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:"); scanf("%s",&data[i]->name); printf(" age:"); scanf("%3d",&data[i]->age); } return; } void output(property *data[]){ int i; for(i=0;i<3;i++){ printf("%d banme\n",i+1); printf("name:%s\n",data[i]->name); printf("age :%3d\n",data[i]->age); } return; } コンパイル時のエラーメッセージは以下のようになりました。(ファイル名はstructure5.c) structure5.c: In function ‘main’: structure5.c:14:2: warning: passing argument 1 of ‘input’ from incompatible pointer type [enabled by default] input(&data); ^ structure5.c:8:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void input(property *data[]); ^ structure5.c:15:2: warning: passing argument 1 of ‘output’ from incompatible pointer type [enabled by default] output(&data); ^ structure5.c:9:6: note: expected ‘struct property **’ but argument is of type ‘struct property (*)[3]’ void output(property *data[]); ^ structure5.c: In function ‘input’: structure5.c:24:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[64]’ [-Wformat=] scanf("%s",&data[i]->name); ^ 構造体の配列をinput関数やoutput関数に渡すときにエラーが発生しているようなのですが、自分で調べても解決できなかったため、質問させて頂きます。 皆様のお知恵を貸してください。なおプログラミング言語自体初心者のため、できる限りわかりやすいお言葉でご教授願います。よろしくお願い致します。

  • C言語_関数_構造体です!教えて下さい!!

    <C言語です> 新しく関数を宣言した中で構造体を使用したいのですが, 上手くいきません。 ご指導宜しくお願い致します!! /*data.csv*/ ------------ 鈴木,21 田中,22 佐藤,23 ------------ 以下プログラム ------------ #include <stdio.h> /*構造体の宣言*/ typedef struct list{ char name[80]; int age; }list1; /*関数の宣言*/ void kiroku(FILE *fo,int ki1){ if(ki1==1) fprintf(fo,"%sの歳は%dです。",data[ki1].name,data[ki1].age); else if(ki==2) fprintf(fo,"%sの歳は%dです。",data[ki2].name,data[ki2].age); else fprintf(fo,"%sの歳は%dです。",data[2].name,data[2].age); } int main(){ char *fin="data.csv"; char *fnmo="kiroku.txt"; FILE *fi,*fo; list1 data[10]; int i,k,r; char ss[80]; //open files. fi=fopen(fin,"r"); fo=fopen(fnmo,"w"); //read r=0; while(fscanf(fi,"%[^,],%d",ss,&k)!=EOF){ strcpy(data[r].name,ss); data[r].age=k; r++; } i=1; /*関数の実行*/ kiroku(fo,i); // close files. fclose(fi); fclose(fo); return 0; }

  • C言語の配列の扱い

    次のような配列bufと変数dataを宣言して bufの中身をdataにコピーしたいのですが、 buf[0]のみで、buf[1]の値が入りません。 具体的には、buf[0]には16進数で0x3f、 buf[1]には0x3aが入っていて、 dataの値を0x3a3fにしたいのです。 教えてください。 ***************************** unsigned char buf[2]; unsigned short data; data = (unsigned short)*buf; *****************************

  • C言語のメモリ領域確保

    ポインタ変数ををmain関数で宣言し、関数test()にて必要分だけ領域確保してそのアドレスをmain関数のポインタ変数に渡して利用することは可能でしょうか。 (サイズのわからないテキストデータを、十分に大きな配列に入れるのではなく、関数でメモリを動的確保して無駄の無い配列に入れたい等) C言語ではやはり無理で、構造体のリストにするのが一番でしょうか。 初歩的なことで申し訳ありませんがどなたかお願いいたします。

Music Maker アクティベート不可
このQ&Aのポイント
  • Music Maker 2021 Premium Edition のアクティベートができない問題が発生しています。
  • 起動するとfreeバージョンになっており、アクティベートしても反応しない状況です。
  • MAGIXのアカウントページで確認するとアクティベートが未済の状態です。解決策をご教示ください。
回答を見る

専門家に質問してみよう