【问题标题】:C - how to add to the end of a char array after realloc()C - 如何在 realloc() 之后添加到 char 数组的末尾
【发布时间】:2020-02-14 23:57:55
【问题描述】:

我有一个叫做“array”的短字符数组。我正在尝试为其重新分配更多空间,然后在末尾添加更多字符。出于某种原因,当我打印数组时,这些额外的字符不会显示出来,尽管当我单独索引它们时它们会显示出来。

#include <stdio.h>
#include <stdlib.h>
int main(){
    char *array = malloc(2);
    array[0] = 'b';
    array[1] = '\0';
    char stringToAdd[] = "honey";
    array = realloc(array, (16));
    int pos;
//add stringToAdd into array one char at a time
    for (pos = 0; pos < 5; pos++){
        array[2+pos] = stringToAdd[pos];
        printf("%d ", 2+pos);
        printf("%c ", array[2+pos]);
        printf("%s\n", array);
    }
    array[pos] = '\0';
    int k = sizeof(array);
//should print out the string "bhoney" and its length
    printf("%s, length = %d\n", array,k);
    free(array);
    return 0;
}

输出是:

2 h b
3 o b
4 n b
5 e b
6 y b
b, length = 8

无论我尝试重新分配多少空间,数组的长度似乎都是 8?

【问题讨论】:

  • OT:关于char *array = malloc(2); 始终检查(!=NULL)返回值以确保操作成功。如果不成功,则调用perror( "malloc failed" );stderr 输出您的错误消息“malloc failed”以及系统认为错误发生的文本原因。这是不可恢复的,所以下一条语句应该是:exit( EXIT_FAILURE );
  • OT:关于:array = realloc(array, (16)); 以及我对malloc() 的评论有考虑:realloc() 的功能可能会失败。当它失败时,一个 NULL 指针值将覆盖array() 中的原始指针,结果是不可恢复的内存泄漏。建议:char temp = realloc(array, (16)); if( ! temp ) { // handle error and exit } array = temp;

标签: c arrays pointers malloc realloc


【解决方案1】:

您在空终止符之后添加了字符。打印字符串在 null 处停止。

将新字符分配给array[1+pos],而不是array[2+pos]。这也适用于在循环之后添加新的空终止符,它应该是

array[1+pos] = '\0';

您也可以使用strcat() 代替循环:

strcat(array, stringToAdd);

它会自动找到空终止符,因此您不必知道偏移量,并正确添加新的空终止符。

sizeof(array) 是指针的大小(8 个字节),而不是字符串的长度。如果你想要字符串长度,你应该使用strlen(array)。见difference between sizeof and strlen in c

【讨论】:

  • 如果我们已经知道字符串的结尾在哪里,strcpy 会不会更好?
  • 我建议 strcat 的目的是让我们不必跟踪偏移量,只需让它自动找到它。
  • 啊,这不清楚,因为您提到它是循环的替代方案,strcpy 更像是一个替代品。或者strncpy 给定循环被设置为在 5 次迭代后停止。
  • 是的,我添加了更多说明。循环被编写为在 5 次迭代后停止,因为这就是 honey 的长度。我不认为他打算将其与字符串长度有任何不同,他只是对长度进行了硬编码。
【解决方案2】:

应该是:

for (pos = 0; pos < 5; pos++){
    array[1+pos] = stringToAdd[pos];
    printf("%d ", 1+pos);
    printf("%c ", array[1+pos]);
    printf("%s\n", array);
}
array[1+pos] = '\0';

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2013-08-18
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多