我有一个包含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
。
答案 0 :(得分:2)
如果char_arr
属于char[N]
类型,则malloc
数组为sizeof(char_arr)/sizeof(char_arr[0])
至my_struct.my_string
。然后使用strcpy
复制每个索引的值。最后free
完成后。
答案 1 :(得分:1)
在将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);
}
答案 2 :(得分:1)
我假设你在堆栈上分配了char_arr
,因此第一种方法失败了。如果不为目标分配内存,则第二种方法将失败。一些正确的方法是:
char_arr
并使用my_struct.my_string = char_arr
或my_string
并使用strcpy(my_struct.my_string, char_arr)
strdup
。更长的解释:
您应该了解C内存管理的基础知识。在C中,string只是指向内存块的指针。复制该指针不会阻止堆栈分配的字符串消失。所以,你必须在堆中分配内存。为了做到这一点,你要么在那里分配char_arr
(这使得第一种方法有效),要么让char_arr
在堆栈上生存,但是你不能保持对它的数据的引用(它正在进行)要在当前函数退出后销毁),您需要将数据复制到堆分配的字符串。这可以手动(使用malloc
)或使用strdup
完成。
答案 3 :(得分:1)
你可以用两种方式做到:
一旦函数退出指针指向的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");