我的代码如下:
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;
为什么这种情况会失败?
答案 0 :(得分:1)
执行此Details_t var;
时,var.a和var.b拥有地址。因此var.a == NULL
将返回false。
答案 1 :(得分:0)
如何使用给定的代码进行编译,应该有
len = strlen(pdetails->a) + strlen(pdetails->b);
而非仅访问a
中未定义的b
和xyz
。
行strcpy(newString,a);
和strcpy(newString,b);
现在您的问题比较NULL==pdetails->a
说[0]的检查地址是否为NULL,永远不会为TRUE。pdetails
已经在堆栈上有内存,所以它的元素也是。
答案 2 :(得分: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
答案 3 :(得分: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);
}
答案 4 :(得分:0)
因为a
和b
不是指针。它们是数组。您不能为它们分配NULL。您根本无法为数组指定任何内容。
这种情况适合你:
if( 0 == pdetails->a[0] + pdetails->b[0] )