【问题标题】:How to correctly allocate memory for an array of char pointers (strings of different length)?如何为 char 指针数组(不同长度的字符串)正确分配内存?
【发布时间】: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 用于获取传递的类型或表达式的大小。如果你传递一个指针,你会得到指针的大小。
  • 有趣的是,除了:你为什么用ldsizeof(sequences)编码?为什么不用"%lu""%d""%zd""%zu""%lld"等?什么建议"%ld"
  • @chux-ReinstateMonica,sizeof() 不返回“简单”整数,但 无符号 数字 - 整数或长整数,取决于编译器。给定结构的大小不能为负数,因此我们使用无符号数。此外,size_t 由即 malloc 使用。什么提示了“%ld”?简单 - 编译器;)

标签: arrays c memory-management char


【解决方案1】:

正如@MikeCAT 所建议的那样,问题在于 sizeof() 的使用不当,它返回给定表达式或类型的大小。这个问题的解决方案是跟踪对象的实际大小,即:使用变量actual_size_of_seq1,在第一个序列中初始化为MIN_BUFFER(不过我使用了一个大小数组)。

【讨论】:

    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多