1

次のようなコードがあります。

typedef struct Details {
    char a[32];
    char b[32];
    char c[32];
} Details_t;

char *xyz(Details_t *pdetails) {
    if ((NULL == pdetails->a) && (NULL == pdetails->b)) {
        return NULL;
    }
    int len = 0;
    char *newString = NULL;
    len = strlen(a) + strlen(b);
    newString = (char *)calloc(1, len + 3);
    strcpy(newString, a);
    strcat(newString, ";");
    strcat(newString, b);
    strcat(newString, ";");

    return newString;
}

からこの構造体のアドレスを渡していますmain()

main() {
    char *ret = NULL;
    Details_t var;
    memset((void *)&var, '\0', sizeof(Details_t));
    strcpy(var.b, "EXAMPLE");
    ret = xyz(&var);
    printf("OUTPUT==%s\n", ret);
}

私の問題は、メンバーaの値をコピーしていないことと、memset()構造の詳細を持ってNULLいるため、コピーされていないすべてのメンバーがNULLである必要があることです。ただし、xyz 関数では、以下の条件が失敗します。

if ((NULL == pdetails->a) && (NULL == pdetails->b))

私が得る出力は以下の通りです:

OUTPUT==;EXAMPLE;

この条件が失敗するのはなぜですか?

4

5 に答える 5

1

これDetails_t var;を実行すると、var.a と var.b は自身のアドレスになります。したがって、var.a == NULLfalse が返されます。

于 2013-07-02T11:06:52.053 に答える
0
  • この条件が失敗するのはなぜですか?

abはポインターではないためです。それらは配列です。それらに NULL を割り当てることはできません。配列に何も割り当てることはできません。

この条件はあなたのために働くはずです:

if( 0 == pdetails->a[0] + pdetails->b[0] )
于 2013-07-02T11:58:11.270 に答える
0

これが役立つかどうかを確認してください:)

#include "stdafx.h"
#include<stdio.h>
typedef struct Details{
char a[32];
char b[32];
char c[32];
}Details_t;

char *xyz(Details_t *pdetails)
{
 if((strlen(pdetails->a)==0) && strlen(pdetails->a)==0)
 {
  return NULL;
 }
 int len = 0;
 char *newString = NULL;
  len = strlen(pdetails->a) + strlen(pdetails->a);
 newString  = (char *)calloc(1,len +3);
 strcpy(newString,pdetails->a);
 strcat(newString,";");
 strcat(newString,pdetails->a);
 strcat(newString,";");

 return newString;
}
//Now I am passing the address of this structure from main().

void main()
{
 char *ret = NULL;
 Details_t var;
 memset((void *)&var,'\0',sizeof(Details_t));
 strcpy(var.b,"EXAMPLE");
 ret = xyz(&var);
 printf("OUTPUT==%s\n",ret);

}
于 2013-07-02T11:05:00.847 に答える
0

与えられたコードでどのようにコンパイルできますか?

len = strlen(pdetails->a) + strlen(pdetails->b);アクセスするだけでなく、 function で定義されていませaん。bxyz

同様の変更が Linestrcpy(newString,a);およびstrcpy(newString,b);

今あなたの質問のために比較するNULL==pdetails->aと、a [0]のチェックアドレスがNULLであるか、TRUEになることはありません。pdetailsスタックにメモリがあるので、その要素も。

于 2013-07-02T10:43:17.073 に答える