[英]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.