簡體   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