-1

「AAA.h」という名前のヘッダー ファイルがあります。このヘッダー ファイルではlrd、次のようなという構造体を定義しています。

struct lrd
{   
int     tc;
char    ptc[5];
char    stc[5];
char    ath[5];
int     vc;
};
struct lrd lr;

このヘッダー ファイル「AAA.h」は、「BBB.c」と「CCC.c」という 2 つの異なるファイル名に含まれています。lr次のように、「BBB.c」ファイルの構造変数に値を割り当てました。

lr.tc=tc;
memcpy(lr.ptc,ptc,sizeof(ptc));
memcpy(lr.stc,stc,sizeof(stc));
memcpy(lr.ath,ath,sizeof(ath));
lr.vc=vc;

上記のソース変数は、データベースから値を取得します。lrそして、「CCC.c」ファイルで構造変数を使用します。次のように、構造 lrd 変数を使用しています。

char *ptc()
{
    sprintf(str, "lr.ptc(%s)", lr.ptc);
    trace(str);
    return lr.ptc;
}
char *stc()
{
    sprintf(str, "lr.stc(%s)", lr.stc);
    trace(str);
    return lr.stc;
}

「CCC.c」ファイルで、変数 stc が間違った値を示します。 それを理解するのを手伝ってください。

4

3 に答える 3

1

あなたのコードは以下を示しています:

memcpy(lr.ptc,ptc,sizeof(ptc));
memcpy(lr.stc,stc,sizeof(stc));
memcpy(lr.ath,ath,sizeof(ath));

ptcstcまたはの宣言は表示されませんath。etc にコピーしているのでlr.ptc、オペランドはソースのサイズではなく etcであるsizeof()必要があります。lr.ptcまたは、本当に気をつけている場合は、2 つのサイズの最小値です。

これを次の方法でデバッグできます/すべきです:

printf("%d (%s)(%s)(%s) %d\n", lr.tc, lr.ptc, lr.stc, lr.ath, lr.vc);

課題の直後。それが間違った値を示している場合、問題は割り当てにあることがわかります。それが正しい値を示している場合は、迷子のポインターやその他の恐ろしい問題を探し始めることができます。

SSCCE ( Short, Self-Contained, Correct Example )を作成していないため、これが問題であるという証拠はありません。具体的には、3 つのソース ファイルの統合セットではなく、コードのフラグメントのみを生成しました (ただし、提供された情報からヘッダーを推測できます)。そして、問題を実際に示しているコード (すべての変数と関数の定義を含みますが、余分な要素は含まれていません) がなければ、推測することしかできません。

于 2012-12-12T15:27:27.913 に答える
1

言うことを参照してくださいbenjarobin。私はあなたに小さな足跡を見せているだけです

AAA.h

#ifndef _AAA_H
struct abc
{
 int x;
 char *y;
 char *Z;
};


extern struct abc p;

extern void assign(void);
extern void display (void);
#endif

CCC.c

#include <stdio.h>
#include "AAA.h"

struct abc p; // Deceleration of p
void assign ()
{
    p.x=20;
    p.y="abcd";
    p.Z="xyz0";

    return;
}

BBB.c

#include <stdio.h>
#include "AAA.h"


void display (void)
{
    printf("x = %d, y =%s, z=%s",p.x,p.y,p.Z);

}

DDD.c には、main function.

#include <stdio.h>
#include "AAA.h"
void main ()
{
    printf("\n\nAssigning Values\n\n");
    assign ();

    printf("\n\nIN BBB.c\n\n");
    display ();

    printf("\n\nIN MAIN\n\n");
    printf("x = %d, y =%s, z=%s",p.x,p.y,p.Z);


}

出力は

Assigning Values



IN BBB.c

x = 20, y =abcd, z=xyz0

IN MAIN

x = 20, y =abcd, z=xyz0
于 2012-12-12T09:49:59.637 に答える