C在结构中动态存储字符串

t9eec4r0  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(160)

我想知道str所指向的字符串分配到了哪里,因为(我假设)malloc只为指向堆的指针腾出了空间。

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int a;
    char* str;
} Bar;

int main(int argc, char *argv[])
{
    Bar* bar_ptr = malloc(sizeof *bar_ptr);

    bar_ptr->a = 51;
    bar_ptr->str = "hello world!";

    printf("%d\n", bar_ptr->a);
    printf("%s\n", bar_ptr->str);

    free(bar_ptr);

    return 0;
}
ff29svar

ff29svar1#

正确--所有的结构类型存储的都是字符串中第一个字符的地址。字符串内容存储在“其他地方”--字符串文字、另一个动态分配的块、staticauto数组等。
您可以声明所有auto

void foo( void )
{
  char aStr[] = "this is not a test";
  Bar barInstance;

  barInstance.a = 51;
  barInstance.str = aStr;

  ...
}

您可以动态分配所有资源:

Bar *barInstance = malloc( sizeof *barInstance );
if ( barInstance )
{
  size_t size = strlen( "This is not a test" );
  barInstance->str = malloc( size + 1 );
  if ( barInstance->str )
    strcpy ( barInstance->str, "This is not a test" );
  ...
  /**
   * You must free barInstance->str before freeing
   * barInstance - just freeing barInstance won't
   * free the memory barInstance->str points to,
   * since that was a separate allocation.
   */
  free( barInstance->str );
  free( barInstance );
}

编辑

而且还有其他的可能性,但重点是字符串本身是与struct示例分开存储的。

gfttwv5a

gfttwv5a2#

如前所述,字符串存储在一个只读数据段中。您可以打印字符串存储的地址(以十六进制格式),如下所示:

printf("0x%p\n", bar_ptr->str);

相关问题