2013-11-26 53 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
     char compliance[256] = {'\0'}; 
     if(compliance == NULL) 
     { 
       printf("compliance is null \n"); 
       return 0; 
     } 
     printf("length of compliance %zd \n",strlen(compliance)); 
     return 0; 
} 

輸出:初始化字符數組爲NULL奇怪的行爲

length of compliance 0 


int main(int argc, char *argv[]) 
{ 
     char compliance[256] = {'\0'}; 
     memset(compliance,0,256); 

     if(compliance == NULL) 
     { 
       printf("compliance is null \n"); 
       return 0; 
     } 
     printf("length of compliance %zd \n",strlen(compliance)); 
     return 0; 
} 

輸出 長度遵守0

正如你們許多人所指出的那樣,我想用memset的(而不是memcpy的)。但仍然不明白爲什麼在第二個程序中合規性不是NULL?或換句話說我如何使它成爲NULL?

+3

我很確定你想使用'memset',而不是'memcpy',就像我確定的那樣,在你的初始化器存在的情況下它是完全不需要的。 – WhozCraig

回答

3

這兩個程序都被破壞;

if(compliance == NULL) 

沒有意義如順應性從未NULL(它是在堆棧中的變量)

在第二部分中從源地址0(NULL)引起段錯誤上

memcpy(compliance,0,256); 

拷貝最平臺。你可能想使用memset這裏

+1

第一行將被優化出來,看起來非常像一個調試語句,以幫助從核心轉儲的原因中刪除該案例 - 第二個,.... –

+0

我不明白你的第一個評論嗎? (compliance == NULL)爲什麼它沒有意義? – liv2hak

+2

,因爲compliance是一個數組,它確保它不在NULL地址。你可能需要'char * compliance = malloc(256)'左右。 – ensc

1

你可能是指memset的

要從地址複製0 - 256字節

2

compliance是一個數組,而不是一個指針(數組名會自動轉換爲指針到某些情況下的第一個元素,但數組不是指針),它將從來沒有等於一個空指針。

第二個示例中的分段錯誤由對memcpy的調用引起。

memcpy(compliance,0,256); 

您正在從空指針複製。可能你想要的是memset