为何C语言程序中buf.data为空但底层数组data有内容?
结合你描述的现象(buf.data输出为空但底层data数组有有效内容),常见原因有以下几种:
结构体指针未正确关联数组
如果buf是包含data指针成员的结构体,大概率是你没把data数组的地址赋值给buf.data。比如写反了赋值顺序(比如写成data = buf.data;而非buf.data = data;),或是完全漏了这步赋值。此时buf.data要么是野指针,要么指向空内存,自然输出为空,但data数组本身的内容不受影响。字符串缺少结束符
\0
如果你用字符串打印函数(比如printf("%s", buf.data))输出buf.data,但data数组里的内容没有以\0结尾,就会出现异常。C语言的字符串必须以\0作为结束标记,打印函数会一直读取内存直到找到这个标记——如果data开头刚好有\0,或是后续内存为空白,就会看起来输出为空。比如data里存了{'h','e','l','l','o'}但没加\0,打印时就可能出问题。malloc后未拷贝数组内容
你用malloc给buf.data分配了内存,但没把data数组的内容拷贝到这块内存里。比如只执行了buf.data = malloc(100);,却没调用memcpy(buf.data, data, sizeof(data)),也没循环把data的元素逐个赋值过去。此时buf.data指向的是全新的空内存,输出自然为空,而data数组的内容仍在原地。结构体长度成员错误
如果buf结构体里还有length这类记录数据长度的成员,要是你把length设成了0,就算buf.data指向了data数组,输出逻辑(比如自定义打印函数)也会因为长度为0而不输出任何内容,看起来就像buf.data为空。
内容的提问来源于stack exchange,提问作者The Fool

