urz*_*eit 2 c null fread language-lawyer
在我的环境中,以下代码运行正常,但它是否可以保证好?
FILE *file = fopen("in", "r");
int *read_to = NULL;
size_t count = 0;
size_t read = fread(read_to, sizeof(*read_to), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud)
分别
FILE *file = fopen("out", "w");
int *write = NULL;
size_t count = 0;
size_t written = fwrite(write, sizeof(*write), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud)
这不能保证工作,严格阅读标准会导致将空指针作为第一个参数传递给fread()或fwrite()导致未定义的行为.
size_t fread(void*restrict ptr,size_t size,size_t nmemb,FILE*restrict stream);
所述的fread函数读取,到阵列指向PTR ....
同样,在§7.21.8.22中:
size_t fwrite(const void*restrict ptr,size_t size,size_t nmemb,FILE*restrict stream);
所述的fwrite函数写入,从阵列通过指向PTR ....
但是,在描述库函数使用的部分(第7.1.4节)中,声明:
如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改存储的指针,则相应参数不具有const限定条件)或具有可变数量参数的函数不期望的类型(提升后),行为未定义.如果一个函数参数被描述为一个数组,那么实际传递给该函数的指针应该具有一个值,使得所有地址计算和对象的访问(如果指针确实指向这样一个数组的第一个元素,这将是有效的)事实上是有效的.
最后,在§42中:
如果违反约束或运行时约束之外的''shall''或''shall not''要求,则行为未定义.
由于空指针不指向有效对象,因此地址计算和访问在空指针上无效,因此将空指针传递给fread()或fwrite()违反§7.1.4的"shall",因此行为未定义.
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |