【发布时间】:2021-10-15 23:01:18
【问题描述】:
对不起,如果这听起来像重复,但我已经检查了类似的问题,并且在我看来我的方法是正确的,因此我想请教您的建议。
我想为指向 char 数组的第一个元素的指针数组分配内存(换句话说:这是一个字符串数组)。此外,这些字符串的长度可能不同。我将 realloc() 用于特定的 char 数组,以免分配不必要的内存。
这里我展示了对我来说似乎很麻烦的代码片段:
#define NUM_SEQ 4
#define MIN_BUFFER 1000
#define MAX_BUFFER 10000
char** read_the_file(char* file_name) {
//opens the file
char** sequences = malloc(NUM_SEQ*sizeof(char*));
printf("all: %ld\n", sizeof(sequences)); //OUTPUT: 8
for (int i = 0; i < NUM_SEQ; i++) {
sequences[i] = malloc(MIN_BUFFER);
printf("seq %d: %ld\n", i, sizeof(sequences[i])); //OUTPUT: 8, for each of them
}
int num_of_seq = 0; //Number of the sequence in the array of sequences
int counter = 0; //Indicates the position of the character in the string
//Loop irrelevant to the problem is omitted
if (counter == sizeof(sequences[num_of_seq])) {
printf("%ld\n", sizeof(sequences[num_of_seq]));
printf("Here\n");
if (sizeof(sequences[num_of_seq])*2 < MAX_BUFFER) {
char* temp = realloc(sequences[num_of_seq], sizeof(sequences[num_of_seq])*2);
if (temp != NULL) {
sequences[num_of_seq] = temp;
} else {
printf("Allocating memory failure\n");
exit(EXIT_FAILURE);
}
} else {
printf("The sequence is too long\n");
exit(EXIT_FAILURE);
}
}
//Let this loop die in loneliness
return sequences;
}
重新分配内存是最近的修改。没有它(只需使用 malloc 分配),即使在 valgrind 下,程序也可以正常工作。现在结果是正确的,但是 valgrind 返回乘以错误:
Address 0x4a5b810 is 0 bytes after a block of size 16 alloc'd
在各种函数中总是引用这个 realloc
另一个问题:序列不超过 10 的长度。计数器不应该等于数组的大小,但是输入了 realloc 的循环 - 这不应该发生。
抱歉,缩进很糟糕,我无法在本网站上保持代码样式的文本,感谢您提出非常感谢的建议。
【问题讨论】:
-
您不能使用
sizeof来确定分配缓冲区的大小。您应该单独维护大小。 -
谢谢,这是一个很好的线索。但是,您能告诉我输出中显示的内容吗?指针的大小?
-
是的,
sizeof用于获取传递的类型或表达式的大小。如果你传递一个指针,你会得到指针的大小。 -
有趣的是,除了:你为什么用
ld和sizeof(sequences)编码?为什么不用"%lu"、"%d"、"%zd"、"%zu"、"%lld"等?什么建议"%ld"? -
@chux-ReinstateMonica,sizeof() 不返回“简单”整数,但 无符号 数字 - 整数或长整数,取决于编译器。给定结构的大小不能为负数,因此我们使用无符号数。此外,size_t 由即 malloc 使用。什么提示了“%ld”?简单 - 编译器;)
标签: arrays c memory-management char