c - C 中的动态一维数组不想在每个框中摄取文件的每个字符

标签 c file dynamic-arrays

在 C 中,我想用文件的每个字符填充动态数组的每个框中。 但是,当我打印数组时,我有:

0 = [] 
1 = [] 
2 = [] 
3 = [] 
4 = [] 
5 = [] 
6 = [] 
7 = [] 
8 = [] 
9 = []

我没有编译错误,但 valgrind 说我有一个:

Conditional jump or move depends on uninitialised value(s) 

在我的main中的printf。 这很奇怪,因为即使在我的 main 中进行了初始化:

array_valid_char = NULL;

valgrind 总是给我带来这个错误。 即使我更改为:

printf("%d = [%d] \n", i, array_valid_char[i]);

显示是一样的。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int* f(char* name_file_in)
{
    FILE *file_in;
    int* array_valid_char = malloc(10 * sizeof(int*));
    int read_char;
    file_in = fopen(name_file_in,"rb");
    if(file_in)
    {
        while ((read_char = fgetc(file_in)) != EOF)
        {
            *(array_valid_char++) = read_char;
        }
    }
    if(file_in){fclose(file_in);}
    return array_valid_char;
}

int main(int argc,char* argv[])
{
    int *array_valid_char = malloc(10 * sizeof(int*));
    array_valid_char = f(argv[1]);
    for (int i = 0; i < 10; i++)
    {
        printf("%d = [%c] \n", i, array_valid_char[i]);
    }
    return(0);
}

我的代码有什么问题吗?

最佳答案

您必须跟踪已分配内存的开头,但您没有跟踪。 (应该返回原始分配的 block 地址)。

int* array_valid_char = malloc(10 * sizeof(int*));
int *st = array_valid_char ;

...
return st;

此外,您还存在内存泄漏 - 您可以在 main() 中省略 malloc

此外,您需要在使用完动态分配的内存后释放它。

free(array_valid_char);

内存分配部分也是

int* array_valid_char = malloc(10 * sizeof(int));

 int* array_valid_char = malloc(10 * sizeof(*array_valid_char));

您想要int数组。

除其他事项外,请检查 malloc 的返回值并正确处理它。

正确的编码方法是索引分配的内存并检查我们是否达到了分配的限制 - 如果是这样,则重新分配。

我们中的许多人都认为 sizeof( *ptr)*10 仅对于清晰的语法等来说足够好,但知道 sizeof 返回 size_t 当将此值与其他值相乘时,与写入相反,它不太可能溢出反过来(使用 int 算术)这是一个好处。 (chux) 例如:sizeof(something)*int*int 将导致使用 size_t 值进行操作,该值不太可能溢出 int*int* sizeof(int)。在第二种情况下 int*int 可能会溢出。(更有可能)

关于c - C 中的动态一维数组不想在每个框中摄取文件的每个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214739/

相关文章:

c - Valgrind 无效写入大小 8

c - 如何在 zlib 中插入类型 0 block 和数据

c - 性能:内存集

C++ GDI+ 从文件中加载图像,然后在*卸载图像之前删除文件

python - 从 C 程序中调用 Python 函数

Java 捕获文件中的 telnet 输出

python - 使用python提取zip文件

javascript - 我可以在javascript中将整个数组插入到其他数组位置吗?

c - 程序因信号 SIGABRT 终止,已中止

c - 如何提高使用 void** 实现的动态数组的性能?