【发布时间】:2021-04-05 18:53:32
【问题描述】:
几天前有人在另一个SO question 中帮助了我大部分内容。那个时候struct base的大小是提前知道的。我想将成员 path 更改为一个字符数组,其大小直到在为 base_new() 函数中的 base 的新实例分配内存之前才知道。
在以前的版本中,要求所有文件都存放在同一目录下,只添加文件名;并且长度限制为 256。现在我想允许用户在../../databases 目录下添加子目录,并且不限制长度。
是否可以在base_new()中的db[i] = malloc( sizeof ( struct base ) )之前或之后设置path的大小?
或者,也许,我应该简单地问一下,这如何实现?
谢谢。
/* Global declaration */
struct base {
...
char path[];
};
struct base **db;
/* in main() */
db = malloc( n * sizeof *db );
for (size_t i = 0; i < n; ++i)
db[i] = NULL;
/* Function to assign pointer db[i] to newly allocated struct base */
int base_new( void )
{
/* declarations */
// Assign pointer to beginning of memory allocation for the new instance of struct base.
if ( ( db[i] = malloc( sizeof ( struct base ) ) ) == NULL )
{
printf( "Error attempting to malloc space for new base.\n" );
return 1;
}
// When size of path was fixed, just truncated name to 256. */
l = sizeof( db[i]->path );
rc = snprintf( db[i]->path, l, "%s%.*s", "../../databases/", 256, name );
if ( rc > l - 1 || rc < 0 )
{
// Not enough space; truncate and add the '\0' at l.
db[i]->path[l] = '\0';
}
// When size of path variable and writing path. */
l = sizeof( db[i]->path ) - 16;
rc = snprintf( db[i]->path, l, "%s%s", "../../databases/", path );
if ( rc > l - 1 || rc < 0 )
{
db[i]->path[l] = '\0';
}
}
我在问题顶部收到一条消息,询问现有问题是否回答了这个问题。它密切相关且很有帮助,但我认为我在这里收到的答案更好,并讨论了其他一些相关点。我不知道它应该如何工作,但我选择了否,因为这个答案更好,或者至少我可以更好地理解它。这个答案显示了如何 malloc 结构的变量成员,并讨论了在释放指向结构的指针之前按成员释放结构的内存。另一个问题更笼统,但仍然有帮助。谢谢。
【问题讨论】:
-
这能回答你的问题吗? Array of variable length in struct
-
您可以使用上述重复帖子中所述的灵活数组成员进行单次分配,或者您可以将
path更改为char *并分配path与第二个malloc通话。 -
@kaylum 是的,这很有帮助。谢谢你。我对结构是什么有点困惑,因为它的所有成员现在都是指针。它本身并不占用太多数据,并且它的所有成员都可以分配到任何可用的地方。它是一个有组织的指针集合,指向杂乱无章的内存块。
标签: c struct dynamic-memory-allocation