C don'中的动态一维数组;I don’我不想在他的每个盒子中摄取文件的每个字符
在C语言中,我想用每个框中文件的每个字符填充一个动态数组。 但是,当我打印阵列时,我有: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
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@user3121023sizeof*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));