从‘char *’初始化‘char’从指针生成整数而不进行强制转换

Posted

技术标签:

【中文标题】从‘char *’初始化‘char’从指针生成整数而不进行强制转换【英文标题】:initialization of ‘char’ from ‘char *’ makes integer from pointer without a cast 【发布时间】:2021-12-01 09:44:49 【问题描述】:

我正在尝试使用几个变量和 gcc 匿名创建一个结构,给定标志 -Werror,不会编译以下内容:

char file_name[A1FS_NAME_MAX];
strcpy(file_name, strrchr(path, '/') + 1);
a1fs_dentry *new_dentry_ptr = (a1fs_dentry *) fs->data_table + last_extent->start * A1FS_BLOCK_SIZE + remaining_directory_entries * sizeof(a1fs_dentry);
*new_dentry_ptr = (a1fs_dentry) 
    .ino = (a1fs_ino_t) fs->first_free_inode_i,
    .name = file_name
;

其中a1fs_dentry定义如下:

typedef struct a1fs_dentry 
    /** Inode number. */
    a1fs_ino_t ino;

    /** File name. A null-terminated string. */
    char name[A1FS_NAME_MAX];

 a1fs_dentry;

导致它失败的警告位于.name = file_name。它还说error: missing braces around initializer。我尝试将 file_name 转换为 char 数组,但它不喜欢那样。我的目标是让它不再发出这些警告。

【问题讨论】:

您可能需要使用空/零名称进行初始化,然后将 strcpy 放入其中,而不是尝试将堆栈分配的 file_name 分配给它... 【参考方案1】:

下面语句中复合字面量的初始化是无效的

*new_dentry_ptr = (a1fs_dentry) 
    .ino = (a1fs_ino_t) fs->first_free_inode_i,
    .name = file_name
;

您不能使用表达式file_name 初始化字符数组name,该表达式在用作初始化程序时会隐式转换为指针,

因此,您应该显式地为指针 new_dentry_ptr 指向的对象的数据成员分配值,而不是使用复合文字,而对于数据成员 name,请使用标准字符串函数 strcpy 作为示例

strcpy( new_dentry_ptr->name, file_name );

【讨论】:

以上是关于从‘char *’初始化‘char’从指针生成整数而不进行强制转换的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的 char 指针初始化 char 数组?

如何使用指针从2D char数组中生成一个句子

错误:赋值从没有强制转换的指针生成整数 [-Werror] str1 = (unsigned char*)s1

在C中通过命令行传递整数?

从字符串文字初始化char数组时会发生什么?

如何从 char 数组中清除单个字符?