[英]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
我该怎么做? 我尝试了以下方法:
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';
strcpy(my_struct.my_string, char_arr);
两者均失败,即目标为空(编译成功)。 为什么上述方法失败,我该如何克服?
我在堆栈中同时拥有struct和char数组,因为一旦退出该函数,我就不需要这些。 我在分配内存之前已将内存分配给my_struct.my_string
。
如果char_arr
是char[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
,因此第一种方法失败。 如果您没有为目标分配内存,第二种方法将失败。 一些正确的方法是:
char_arr
并使用my_struct.my_string = char_arr
,或者 my_string
并使用strcpy(my_struct.my_string, char_arr)
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.