【问题标题】:char array to a string inside a structchar 数组到结构内的字符串
【发布时间】:2012-03-23 19:25:40
【问题描述】:

我有一个 4 个字符的数组,例如:

char char_array[10];

char_arr[0] = 'a';
char_arr[1] = 'b';
char_arr[2] = 'c';
char_arr[3] = 'd';
char_arr[4] = '\0';

我有一个结构:

typedef struct{
int my_int;
char *my_string;
} my_struct_t;

my_struct_t my_struct;  

my_struct.my_string = malloc(10);

我想将 char 数组分配给字符串 my_struct.my_string 我该怎么做?我尝试了以下方法:

尝试:1

my_struct.my_string = malloc(10) 
my_struct.my_string[0] = char_arr[2];
my_struct.my_string[1] = char_arr[2];
my_struct.my_string[2] = '\0';

尝试:2

strcpy(my_struct.my_string, char_arr);

两者都失败,即目标为空(编译成功)。为什么上述失败,我该如何克服?

我在堆栈中同时拥有 struct 和 char 数组,因为一旦我退出函数,我就不需要这些了。在分配之前,我已将内存分配给my_struct.my_string

【问题讨论】:

  • 如何分配char_arr
  • @Vijay 你所说的失败到底是什么意思?发布确切的编译器错误消息。
  • 能否请您在调试器中查看,my_struct.my_string[0]my_struct.my_string = malloc(10); my_struct.my_string[0] = char_arr[2]; 之后的值是多少?这段代码似乎是正确的。

标签: c string string-concatenation arrays


【解决方案1】:

如果char_arrchar[N] 类型,则malloc 数组sizeof(char_arr)/sizeof(char_arr[0])my_struct.my_string。然后使用strcpy 在每个索引处复制值。最后free完成。

【讨论】:

  • 好的,对不起,我没有准确地发布我之前想要的内容,我认为更简单的视图会有所帮助。我什么是将数组的一部分复制到 char* 中。所以在这里我可以完全按照你提到的那样计算空间,但我将它硬编码为值 10 并完成了剩下的工作。但是当我打印它时,目的地仍然没有任何内容。
  • 我不确定你到底在做什么。这对我来说可以。 ideone.com/fYF6K
【解决方案2】:

你可以通过两种方式做到这一点:

将指针赋值给字符数组

一旦函数退出,指针指向的 char_array[10] 将失效。编译器不会产生错误,但最终程序可能会崩溃,因为您将覆盖另一个函数的数据,或者读取错误的数据,因为另一个函数用其他东西覆盖了它。您应该在您的计算机架构上搜索堆栈的工作原理

    char                  char_array[10];
    my_struct_t           var;

    var.my_string = &array[0];

    var.my_string[3] = 'a';

    if (var.my_string[0] == char_array[0])
        printf("See, changes using the pointer effect char_array.\n");
    else
        printf("This will never happen.\n");

分配内存并复制字符数组

我使用 for 循环来帮助更容易理解它的工作原理。一旦当前函数退出,如果您碰巧以某种方式保留它,指针仍将指向有效内存。

    char                  char_array[10];
    my_struct_t           var;
    int                   l;

    char_array[0] = 'a';
    char_array[1] = 0;

    // l = strlen(&char_array[0])
    for (l = 0; char_array[l] != 0; ++l);

    var.my_string = (char*)malloc(sizeof(char) * l);

    // strcpy(var.my_string, &char_array[0]);
    for (l = 0; char_array[l] != 0; ++l)
        var.my_string[l] = char_array[l];

    var.my_string[0] = 'a';

    if (var.my_string[0] != char_array[0])
        printf("See, changes using the pointer DO NOT effect char_array.\n");
    else
        printf("This will never happen.\n");

【讨论】:

    【解决方案3】:

    我假设,您在堆栈上分配您的 char_arr,因此第一种方法失败。如果您不为目标分配内存,则第二种方法会失败。一些正确的方法是:

    1. 在堆上分配char_arr并使用my_struct.my_string = char_arr,或者
    2. 在堆上分配my_string并使用strcpy(my_struct.my_string, char_arr)
    3. 如果您的编译器支持,请使用strdup

    更长的解释:
    您应该了解 C 内存管理的基础知识。在 C 中,字符串只是一个指向内存块的指针。复制该指针不会阻止堆栈分配的字符串消失。因此,无论如何,您都必须在堆中分配内存。为了做到这一点,您要么在那里分配char_arr(这使第一个方法有效),要么让char_arr 存在于堆栈中,但是你不能保留对其数据的引用(它将在之后被销毁您当前的函数退出),您需要将数据复制到堆分配的字符串。这可以手动完成(使用malloc)或使用strdup

    【讨论】:

      【解决方案4】:

      在将 char_arr 存储到其中之前,您需要为 my_string 分配内存。

      如果您已分配内存,它应该可以工作。这与您的代码相同(没有 typedef)并且工作正常:

      构造我的{ 诠释我的诠释; 字符 *my_string; }p;

      int main()
      {
      char char_arr[5];
      strcpy(char_arr, "abcd");
      p.my_string = (char*) malloc(5);
      strcpy(p.my_string, char_arr);
      print_string(); //
      return 0;
      }
      
      print_string()
      {
      printf("%s",p.my_string);
      }
      

      【讨论】:

      • 我已经为它分配了内存。我忘了把它放在第一位,现在编辑它
      猜你喜欢
      • 2018-05-01
      • 1970-01-01
      • 2011-08-04
      • 2014-05-12
      • 2021-10-05
      • 2017-06-15
      • 2016-01-21
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多