【问题标题】:C - how to add a char to an array [closed]C - 如何将字符添加到数组中[关闭]
【发布时间】:2020-05-30 16:23:13
【问题描述】:

我试图弄清楚如何将一个简单的char 添加到使用malloc 创建的数组中。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char *array = malloc(2);
    array[0] = "h";
    printf("%s", array);
    return 0;
}

它给出警告:

 warning: assignment makes integer from pointer without a cast [-Wint-conversion]
array[0] = "h";

如果我仍然运行程序,它只会打印出 3 个随机符号。

【问题讨论】:

  • array[0]='h'; array[1]='\0' 或 strcpy(array, "h");
  • 很遗憾编译器没有拒绝这个错误的伪代码。 gcc -Wall -W -Werror 是你的朋友。
  • array 不是一个数组,它是一个指向数组的指针。 malloc() 不创建数组,它分配一个。您不是向数组添加字符,而是要分配或设置数组的char 元素。
  • memcpy(array, "h", 2) 而不是array[0] = "h"; 会起作用(2 是长度,您将在其中复制两个字节以包含尾随的 '\0' 字符(字节))。数组指针的名称,与您分配的两个字节内存的地址相同。如果您完成了char array[2]; 后跟相同的memcpy,它也会起作用。对于这么小的情况,跳过 malloc() 和 memcpy() 会更实际,但这只是为了说明一点。对于这么小的事情,你会按照@kaylum 的建议去做。顺便说一句:在退出前不显式调用free() 以释放内存是不好的做法。
  • 关于最后一条评论:我从字面上使用了数字 2,但是当将长度传递给 memcpy() 和 I/O 调用等时......通常你使用 sizeof() 来指代项或使用命名常量。使用严格的数字参数是不好的做法,因为它使调试代码正在执行的操作变得更加困难。操作系统将在程序退出时释放您的内存,但您应该始终习惯于在每次执行malloc() 时考虑将free() 调用放在哪里。 malloc() 不释放内存并创建泄漏是一个常见的坏习惯。总是小心 w/malloc()!

标签: c arrays pointers char malloc


【解决方案1】:

您正在为一个字符分配一个字符串。相反,分配一个字符:

array[0] = 'h';

之后,您需要以空值终止您的字符串:

array[1] = '\0';

或者,您可以使用strcpy 复制字符串:

strcpy(array, "h");

【讨论】:

    【解决方案2】:

    对于本声明中的初学者

    array[0] = "h";
    

    使用字符串文字而不是单个字符(整数)'h'。字符串文字被转换为指向其第一个字符的指针。因此,在此语句中,您尝试将指针分配给字符。

    你必须使用像

    这样的字符文字
    array[0] = 'h';
    

    但在这种情况下,数组将不包含字符串,因为数组的第二个字符未初始化并且具有不确定的值。而转换说明符%s用于输出字符串。

    所以你需要再追加一条这样的语句

    array[1] = '\0';
    

    或者您最初可以使用calloc 而不是malloc。

    char *array = calloc(2);
    

    然后写就够了

    array[0] = 'h';
    

    如果你想使用字符串文字,那么你应该使用标准 C 函数 strcpy 来代替赋值

    strcpy( array, "h" );
    

    将字符串文字复制到动态分配的数组中。

    当不再需要该数组时,您应该释放分配的内存。

    free( array );
    

    【讨论】:

      【解决方案3】:

      array[0] 是 char&amp;。
      "h" 是 const char[2]。
      您不能将 char 的数组分配给 char 引用。
      你可能想要array[0] = 'h';,因为'h' 是const char。

      【讨论】:

      • 什么是参考? char 后面的 &amp; 是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2015-03-09
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多