包含内存分配的 C 字符串结构

C string struct with mem allocation included

我正在使用一堆字符串进行日志记录。我想重构我的代码并创建一个结合了 char、它的长度和分配的大小的新结构。我的想法是让我的内部字符串操作更流畅,代码更易读,同时为每个字符串分配其自己的最大分配内存,以将使用量保持在最低限度,但防止堆栈溢出。我做了这个简单的例子:

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


typedef struct 
{
  char *str;
  int size;
  int max;
} Text;

void defText(Text *text, int max)
{
  text->str=(char*) malloc(max * sizeof(char));
  text->str="";
  text->max=max;
}


int main() {
    Text *a;
    defText(a,50);
    a->str="Test all you want";
    printf("OUT: %s %zu %lu",a->str,strlen(a->str),sizeof(a->str));
    return 0;
}

函数 defText 初始化并分配内存。然而,当我检查我的结构中的 char 的大小时,无论我在 defText 中设置什么,我总是得到 8。这种处理字符串及其属性的结构是否可能?如果是这样,这里有什么问题?

您的代码中存在几个问题,这是一个解决这些问题的示例:

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

typedef struct 
{
  char *str;
  // you could use size to keep track of the strlen. That's particularly
  // desirable if you find yourself calling strlen "a lot", since that
  // function recalculates the length every time it's called
  int size;
  int max;
} Text;

void defText(Text *text, int max)
{
  // no need to cast the return of malloc. In fact, sizeof(char) is defined by
  // the standard to be 1 so you could take that out also.
  text->str=malloc(max * sizeof(char));
  // `=` is not the proper way to write strings in C, you must use strcpy
  // or something similar. It looks like here you're simply trying to
  // create an empty string.
  //text->str="";
  // per @JohnBollinger's comment, the best thing to do here to create
  // an empty string is simply set to the first byte to the NUL
  // terminator.
  text->str[0] = '[=10=]';
  text->max=max;
}


int main() {
    Text a;  // store this in automatic memory, now the object exists without having to malloc
    defText(&a,50); // Use & to pass the address of a to defText

    // as mentioned, this is not the proper way to write data to a string in
    // C. What you've done here is create a memory leak and point a.str to
    // the string literal "Test all you want". Use strcpy (or similar) to
    // write that string into the data you actually malloc'ed (using the dot
    // operator now since `a` is no longer a pointer)
    //a->str="Test all you want";
    strcpy(a.str, "Test all you want");
    // a.str is a pointer, and will always be 8 bytes on your system no matter
    // the size of the memory it points to
    printf("OUT: %s %zu %zu",a.str,strlen(a.str),sizeof(a.str));

    // clean up allocated memory. Since we're about to exit, there's
    // really no need to do this here (the OS will reclaim all allocated
    // memory when the process ends), but if you're writing a more
    // involved, long-running program, you need to be sure to handle
    // memory allocations and deallocations appropriately as needed
    free(a.str);

    return 0;
}

Demo

a->str 是指针。 正确答案是 sizeof(*(a->str))