C don'中的动态一维数组;I don’我不想在他的每个盒子中摄取文件的每个字符

C don'中的动态一维数组;I don’我不想在他的每个盒子中摄取文件的每个字符,c,file,dynamic-arrays,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) 在printf的我主要的。 这很奇怪,因为即使在我的主体中有一个初始化: arr

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

0 = [] 
1 = [] 
2 = [] 
3 = [] 
4 = [] 
5 = [] 
6 = [] 
7 = [] 
8 = [] 
9 = []
我没有编译错误,但valgrind说我有一个:

Conditional jump or move depends on uninitialised value(s) 
在printf的我主要的。 这很奇怪,因为即使在我的主体中有一个初始化:

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);
}
#包括
#包括
int*f(字符*名称\文件\输入)
{
文件*FILE_in;
int*array\u valid\u char=malloc(10*sizeof(int*);
int read_char;
file_in=fopen(名称_file_in,“rb”);
如果(在中存档)
{
while((read_char=fgetc(file_in))!=EOF)
{
*(数组\有效\字符++)=读取\字符;
}
}
if(file_in){fclose(file_in);}
返回数组\有效\字符;
}
int main(int argc,char*argv[])
{
int*array\u valid\u char=malloc(10*sizeof(int*);
数组_valid_char=f(argv[1]);
对于(int i=0;i<10;i++)
{
printf(“%d=[%c]\n”,i,数组\有效\字符[i]);
}
返回(0);
}

我的代码有什么问题?

您必须跟踪分配内存的开头,而您没有这样做。(应返回原始分配的块地址)

还有内存泄漏-可以省略main()中的
malloc

此外,在使用完动态分配的内存后,还需要释放该内存

free(array_valid_char);
内存分配部分也将是

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

您需要
int
的数组

检查
malloc
的返回值并正确处理

编写代码的正确方法是索引到分配的内存中,并检查我们是否达到了分配的内存的极限——如果达到极限,则重新分配

我们中的许多人把自己局限于
sizeof(*ptr)*10的思想中
仅适用于清晰的语法等,但知道
sizeof
返回
size\t
当将此值与其他值相乘时,溢出的可能性较小,而不是以相反的方式编写(使用
int
算术),这是一个好处。(丘克斯)
例如:
sizeof(something)*int*int
将导致使用
size\u t
值的操作,该值不太可能溢出
int*int*sizeof(int)
。在第二种情况下,
int*int
可能会溢出。(更有可能)

您的代码中存在一些问题:

使用
*(array\u valid\u char++)
,您可以在每次通过循环时移动指针。如果要使用此方法,则需要使用其他变量跟踪数组的开头。您还可以使用迭代器
array\u valid\u char[i]
,该迭代器从0开始,并在每次循环时递增

在main中,您可以malloc您的数组
int*array\u valid\u char=malloc(10*sizeof(int*))但是您在使用
array\u valid\u char=f(argv[1])之后覆盖它。如果在函数中malloc数组并将其返回,内存仍然是分配的

在printf中,
%d
用于显示数字,
%c
用于显示字符。在您的情况下,您需要使用
%c
。在另一种情况下,您将看到角色的价值

顺便说一下,您还可以使用int数组来接收char数组。现在这不是一个问题,但是对于一些优化,您可以使用char数组来占用更少的内存


另外,不要忘了
释放
不再使用时使用的内存,它在更大的程序中可能会很有用。

考虑如果“if my file is:abcdefghik”只是一个开始,并且还有以下
'\n'
会发生什么。分配给
array\u valid\u char
的已分配内存溢出导致未定义行为(UB)。@user3121023则
int*array\u valid\u char
类型不正确。分配应与
ptr=mallloc(sizeof*ptr*n)
model匹配。@user3121023:Yes@user3121023
sizeof*ptr
返回一个
size\u t
,而不是
int
。本例中的值与
sizeof(int)相同
@yano注意:当
sizeof*array\u valid\u char
sizeof*array\u valid\u char*100000*100000
那样更复杂、更大时,使用
sizeof*array\u valid\u char
进行引导具有优势,因为它确保所有的数学都是用至少
size\u t
math而不是
int
math完成的,这可能会溢出。@chux哦,你是这么说的
10*sizeof(*array\u valid\u char)
执行整数数学,而
sizeof(*array\u valid\u char)*10
执行
size\u t
math?纠正我的错误,自由函数必须在我的主函数中。不在我的职能范围内。对吧?@Linuxcrumer.:Yep@yano. 否。
10*sizeof(*array\u valid\u char)
10
转换为
size\u t
,并按照
size\u t*size\u t
进行计算。使用
10
sizeof
没有任何好处。它与
int*int*size\u t
相比,前者具有
size\u t*int*int
的优势。第一个可以做一个
int*int
,这可能是,但如果是
size\u t
math,可能不是。我刚刚想出了一个解决方案,但是使用了*(array\u valid\u char++)。它运转良好。或者这不是一种优化编码的方法?@linuxcrumer*(array\u valid\u char++)很好。这个想法只是为了向你解释这两种方法之间的区别。
int* array_valid_char = malloc(10 * sizeof(int));
 int* array_valid_char = malloc(10 * sizeof(*array_valid_char));