数组的行为

时间:2013-07-02 10:36:34

标签: c arrays

我的代码如下:

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;

为什么这种情况会失败?

5 个答案:

答案 0 :(得分:1)

执行此Details_t var;时,var.a和var.b拥有地址。因此var.a == NULL将返回false。

答案 1 :(得分:0)

如何使用给定的代码进行编译,应该有

len = strlen(pdetails->a) + strlen(pdetails->b);而非仅访问a中未定义的bxyz

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)

  • 为什么这种情况会失败?

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

这种情况适合你:

if( 0 == pdetails->a[0] + pdetails->b[0] )