C 中的动态一维数组不想在他的每个框中摄取文件的每个字符
A dynamic 1D array in C don't want to ingest each character of a file in each of his boxes
在C中,我想在他的每一个盒子里,用一个文件的每个字符填充一个动态数组。
但是相反,当我打印数组时,我有:
0 = []
1 = []
2 = []
3 = []
4 = []
5 = []
6 = []
7 = []
8 = []
9 = []
我没有编译错误,但是valgrind说我有:
Conditional jump or move depends on uninitialised value(s)
在我主要的 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);
}
我的代码有什么问题?
您必须跟踪分配的内存的开头,而您没有。 (原始分配的块地址应该是 returned )。
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
的 return 值并妥善处理。
正确的编码方式是索引分配的内存并检查我们是否达到分配的限制 - 如果是,则重新分配。
我们中的许多人认为 sizeof( *ptr)*10
仅对清晰的语法等而言足够好,但知道 sizeof
returns size_t
当它与其他值相乘时,它不太可能溢出,而不是反过来写(有 int
算术)这是一个好处。 (chux)
例如:sizeof(something)*int*int
将执行具有 size_t
值的操作,该值不太可能溢出 int*int*sizeof(int)
。在第二种情况下 int*int
可能会溢出。(更有可能)
您的代码中存在一些问题:
使用 *(array_valid_char++)
,每次通过循环时您都会移动指针。如果要使用此方法,则需要使用其他变量跟踪数组的开头。您还可以使用从 0 开始并在每次循环时递增的迭代器 array_valid_char[i]
。
在你的主程序中,你 malloc 你的数组 int *array_valid_char = malloc(10 * sizeof(int*));
但你在 array_valid_char = f(argv[1]);
之后覆盖了它。如果你在一个函数中 malloc 你的数组并用 return 将它发回,内存仍然被分配。
在printf中,%d
是显示一个数字,%c
是显示一个字符。在您的情况下,您需要使用 %c
。在另一种情况下,您将看到角色的 ASCII 值。
顺便说一句,您还使用了一个int 数组来接收char 数组。现在这不是问题,但为了一些优化,你可以使用 char array 来占用更少的内存。
此外,不要忘记 free
当您不再使用它时使用过的内存,它在更大的程序中可能会有用。
在C中,我想在他的每一个盒子里,用一个文件的每个字符填充一个动态数组。 但是相反,当我打印数组时,我有:
0 = []
1 = []
2 = []
3 = []
4 = []
5 = []
6 = []
7 = []
8 = []
9 = []
我没有编译错误,但是valgrind说我有:
Conditional jump or move depends on uninitialised value(s)
在我主要的 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);
}
我的代码有什么问题?
您必须跟踪分配的内存的开头,而您没有。 (原始分配的块地址应该是 returned )。
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
的 return 值并妥善处理。
正确的编码方式是索引分配的内存并检查我们是否达到分配的限制 - 如果是,则重新分配。
我们中的许多人认为 sizeof( *ptr)*10
仅对清晰的语法等而言足够好,但知道 sizeof
returns size_t
当它与其他值相乘时,它不太可能溢出,而不是反过来写(有 int
算术)这是一个好处。 (chux)
例如:sizeof(something)*int*int
将执行具有 size_t
值的操作,该值不太可能溢出 int*int*sizeof(int)
。在第二种情况下 int*int
可能会溢出。(更有可能)
您的代码中存在一些问题:
使用 *(array_valid_char++)
,每次通过循环时您都会移动指针。如果要使用此方法,则需要使用其他变量跟踪数组的开头。您还可以使用从 0 开始并在每次循环时递增的迭代器 array_valid_char[i]
。
在你的主程序中,你 malloc 你的数组 int *array_valid_char = malloc(10 * sizeof(int*));
但你在 array_valid_char = f(argv[1]);
之后覆盖了它。如果你在一个函数中 malloc 你的数组并用 return 将它发回,内存仍然被分配。
在printf中,%d
是显示一个数字,%c
是显示一个字符。在您的情况下,您需要使用 %c
。在另一种情况下,您将看到角色的 ASCII 值。
顺便说一句,您还使用了一个int 数组来接收char 数组。现在这不是问题,但为了一些优化,你可以使用 char array 来占用更少的内存。
此外,不要忘记 free
当您不再使用它时使用过的内存,它在更大的程序中可能会有用。