2013-07-02 3 views
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); 
} 

Моей проблема: я не копируя любое значение в члене а и I Have memset() структуру детали с NULL так что всеми членами, которые не скопированными должна быть NULL. Но в функции xyz условие ниже получает отказ.

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

и выход, который я получаю ниже:

OUTPUT==;EXAMPLE;

Почему это условие получает неудачу?

+0

вместо 'NULL == pdetails-> a' использовать' STRLEN (pdetails-> а) == 0 ' –

+0

Я надеюсь, что 'а, б и в 'должны показать общий случай, а не то, что у вас в коде. Кроме того, 'main()' должно быть, по крайней мере, некоторой вариацией 'returnType main() {...}', если не 'main (void)' обычно 'int main (void) {...}' 'cause почему нет? – ChiefTwoPencils

ответ

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

0

Как вы можете компилировать с данным Кодексом, должны быть

len = strlen(pdetails->a) + strlen(pdetails->b);, а не только доступ к a и b, который не определен в функции xyz.

Похожие изменения необходимы в линии strcpy(newString,a); и strcpy(newString,b);

Теперь ваш вопрос сравнения NULL==pdetails->a говорит проверки адреса [0] является NULL или нет, который никогда не будет TRUE. pdetails имеют память на стеке, поэтому ее элементы тоже.

+0

Это была моя ошибка в записи –

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); 

} 
1

когда Details_t var; выполняется, var.a и var.b собственный адрес. Итак, var.a == NULL вернет false.

+1

followup: дело в том, что 'Details_t :: a' - ARRAYS not POINTERS. Есть реальная разница. Поскольку массив встроен внутри структуры, он имеет адрес почти всегда, и на самом деле условие IF всегда истинно в вашем случае. «Memset» действительно сделает всю память обнуленной, но ** в структуре нет указателей **. После memset у вас будет фактически структура с тремя массивами внутри, а содержимое этих массивов будет состоять из 32 обнуленных символов. Вы можете использовать это! Следовательно, вместо 'pdetails-> a! = NULL' просто проверьте' pdetails-> a [0] == NULL'. – quetzalcoatl

0
  • Зачем возникает это условие?

Потому что a и b не указатели. Это массивы. Вы не можете назначить им NULL. Вы вообще не можете присваивать массив массиву.

Это условие должно работать для вас:

if(0 == pdetails->a[0] + pdetails->b[0]) 
Смежные вопросы