将char数组初始化为NULL奇怪的行为

时间:2013-11-26 01:15:58

标签: c pointers char

#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;
}

输出:

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 个答案:

答案 0 :(得分:3)

两个节目都被打破了;

    if(compliance == NULL)

没有意义,因为合规性永远不会为NULL(它是堆栈上的变量)

在第二部分

    memcpy(compliance,0,256);

从源地址0(NULL)复制,这会在大多数平台上导致segfault。您可能希望在此使用memset

答案 1 :(得分:2)

compliance是一个数组,而不是指针(在某些情况下,数组名称会自动转换为指向第一个元素的指针,但数组不是指针),它将< strong> never 等于空指针。

第二个示例中的分段错误是由对memcpy的调用引起的。

memcpy(compliance,0,256);

您正在从空指针复制。可能你想要的是memset

答案 2 :(得分:1)

你可能意味着memset

您正在从地址0 - 256字节

复制