首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效的4码读数,浮雕

无效的4码读数,浮雕
EN

Stack Overflow用户
提问于 2017-08-22 20:04:43
回答 1查看 1.2K关注 0票数 0

我正在执行一个任务,但在调试时遇到了一个奇怪的问题。

代码语言:javascript
复制
==30771== Invalid read of size 4
==30771==   at 0x4E9CC5D: __isoc99_fscanf (isoc99_fscanf.c:30)
==30771==   by 0x400728: main main.c:13)
==30771== Address 0x0 is not stack'd, malloc'd or (recently) free'd

我一辈子都弄不明白为什么我会有这个错误。除了这个代码外,代码是有效的。

我做了一个测试项目来隔离错误:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *myFile;
    myFile = fopen("../map1.map", "r");

    char *buff = malloc(51*sizeof(char));

    //Scanning for the amount of edges.
    if (fscanf(myFile, "%s", buff) != 1){
        printf("Something is wrong\n");
    }

    printf("%s", buff);

    fclose(myFile);

    char str[20];
    scanf("%s", str);
}

该文件如下所示:

代码语言:javascript
复制
9
Nod1 Nod2

它正确编译并打印9。

使用以下设置编译:

代码语言:javascript
复制
gcc -g -std=c99 -Wall -Werror -O0 main.c -o myProgram

在下面的设置中运行:

代码语言:javascript
复制
valgrind --leak-check=yes --show-reachable=yes ./myProgram

有人能发现我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-22 20:10:04

有一个未定义行为的概念,如果你不小心,你可以触发这种未定义的行为,然后,你将无法判断程序是否工作。

我将发布一些我认为非常健壮的代码,它根本不应该引起任何英勇的报告,包括删除最后一条不做任何事情的语句,我更改的每一件事情都是--可能是问题的原因。

您必须检查每个函数在返回值时是否成功,您自己的程序的一个更健壮的版本是

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE *file;
    const char *filepath;
    char *buffer;

    filepath = "../map1.map";
    file = fopen(filepath, "r");
    if (file == NULL) {
        fprintf(stderr, "error openning: %s\n", filepath);
        return -1;
    }

    buffer = malloc(51);
    if (buffer == NULL) {
        fprintf(stderr, "error, memory exhausted\n");
        fclose(file);

        return -1;
    }


    // Scanning for the amount of edges.
    if (fscanf(file, "%s", buffer) != 1){
        fprintf(stderr, "error, cannot read from the file\n");
    } else {
        fprintf(stdout, "%s\n", buffer);
    }
    // Release all resources
    fclose(file);
    free(buffer);

    return 0;
}

如果您在运行这段代码时很有可能会报告错误,而不管该文件是否存在。但你必须小心,

代码语言:javascript
复制
fscanf(file, "%s", buffer)

因为它会使buffer溢出,所以告诉fscanf()读取给定数量的字节,如下所示

代码语言:javascript
复制
fscanf(file, "%50s", buffer)

这样,fscanf()最多只能扫描50字节,并为终止null字符留出空间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45826113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档