繁体   English   中英

将char数组转换为结构内的字符串

[英]char array to a string inside a struct

我有一个包含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_arrchar[N]类型,则将sizeof(char_arr)/sizeof(char_arr[0]) malloc数组sizeof(char_arr)/sizeof(char_arr[0])my_struct.my_string 然后使用strcpy在每个索引处复制值。 完成后最终free

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

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

struct my {int my_int; char * my_string; }磷;

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);
}

我假设,您在堆栈上分配了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 (这使第一种方法有效),或者让char_arr在堆栈上,但是您不能保留对其数据的引用(在当前函数退出后它将被销毁) ),则需要将数据复制到堆分配的字符串中。 这可以手动完成(使用malloc ),也可以使用strdup

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

将指针分配给字符数组

一旦函数退出,指针指向的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");

分配内存并复制字符数组

我使用循环,以帮助您更轻松地了解其工作原理。 当前函数退出后,如果碰巧以某种方式保留指针,指针仍将指向有效内存。

    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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM