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

when this Details_t var; is executed, var.a and var.b own address. So var.a == NULL will return false.

于 2013-07-02T11:06:52.053 回答
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);而不仅仅是访问a并且b未在 function 中定义xyz

Linestrcpy(newString,a);strcpy(newString,b);

现在,对于您的问题,比较NULL==pdetails->a说检查 a[0] 的地址是否为 NULL,这永远不会是 TRUE。pdetails堆栈上有内存,所以它的元素也有。

于 2013-07-02T10:43:17.073 回答
0

所有未复制的成员都应为 NULL

那不是真的,测试这段代码:

#include <stdio.h>
#include <string.h>

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

int main(void)
{
    Details_t var, *pt;

    memset((void *)&var, '\0', sizeof(Details_t));
    printf("%s\n", var.a == NULL ? "null" : "not null"); /* output = not null */
    /* Also for a pointer */
    pt = &var;
    printf("%s\n", pt->a == NULL ? "null" : "not null"); /* output = not null */
    /* Maybe you want: */
    printf("%s\n", pt->a[0] == '\0' ? "empty" : "not empty"); /* output = empty */
    return 0;
}

其他小问题:

int main(void)代替main()

不要施放calloc

_t后缀为 POSIX 保留

于 2013-07-02T10:56:36.897 回答
0
  • 为什么这种情况会失败?

因为aandb不是指针。它们是数组。您不能将 NULL 分配给它们。您根本无法将任何内容分配给数组。

这种情况应该适合你:

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