#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?
答案 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字节
复制