将char数组转换为struct中的字符串

时间:2012-03-23 19:25:41

标签: c string string-concatenation arrays

我有一个包含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

4 个答案:

答案 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,因此第一种方法失败了。如果不为目标分配内存,则第二种方法将失败。一些正确的方法是:

  1. 在堆上分配char_arr并使用my_struct.my_string = char_arr
  2. 在堆上分配my_string并使用strcpy(my_struct.my_string, char_arr)
  3. 如果您的编译器支持,请使用strdup

  4. 更长的解释:
    您应该了解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");