让我们举个例子。我有一个主文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "otherfile.h"
char output[1024*10];
int main(){
writeSomething(output);
return 0;
}
和另一个具有以下功能的文件:
void writeSomething(char *o){
printf("sizeof(o)=%d", sizeof(o));
//code
memset(o,0,sizeof(o));
// code
}
在编译时,我收到了警告:
'memset'调用中'sizeof'的参数与表达式相同 目的地;你的意思是提供明确的长度吗?
我想要的是在我的函数中将整个output
数组设置为0
,因此所有1024 * 10字节。但是因为我将它作为指针传递,它只会将前8个字符设置为0
(因为sizeof(o)=8
)。
如何通过指针对整个数组进行memset?这甚至可能吗?
答案 0 :(得分:1)
问题在于,当作为参数传递给函数时,数组会衰减成指针,并且有关其大小的信息会丢失。
将功能重新定义为
void writeSomething(char *o, size_t sz){
printf("sizeof(o)=%d", sizeof(char) * sz);
//code
memset(o, 0, sizeof(char) * sz);
// code
}
以便对它的调用看起来像writeSomething(output, 1024*10);
。
正如评论中所指出的,C99标准要求sizeof(char)
为1
,因此可以省略我提供的代码中的sizeof(char)
。但是,出于风格原因,我宁愿把它留在那里。