是否在C中的结构内返回指向char数组的指针?

用户名

我在头文件中有以下结构:

static FILINFO fno;

看起来像这样:

typedef struct {
DWORD   fsize;      /* File size */
WORD    fdate;      /* Last modified date */
WORD    ftime;      /* Last modified time */
BYTE    fattrib;    /* Attribute */
char    fname[13];  /* File name */
} FILINFO;

现在,我希望某个函数返回一个指向fname []的指针,因为该结构是静态定义的,应该可以。这是我的功能:

char* get_open_file_name (void)
{
    return fno.fname;
}

我从主要这样调用此函数:

char* temp;

int main (void)
{
    intialize_sd_card ();
    ...
    ...
    temp = get_open_file_name();

这将导致冲突类型错误消息。但是,如果我尝试这样称呼它:

char* temp = get_open_file_name();

有用。我在这里想念什么?

编辑:这是我从GCC获得的实际错误消息

Severity    Code    Description Project File    Line
Warning     assignment makes integer from pointer without a cast
S.交换被认为是有害的

只是一个疯狂的猜测,但是这样的事情会在这里起作用吗?

#include <stdio.h>

typedef struct {
    char fname[4];
} FILINFO;

static FILINFO fno;

char* temp;

char* get_open_file_name(void) {
    return fno.fname;
}

int main(void) {
    fno.fname[0] = 'L';
    fno.fname[1] = 'o';
    int temp; //my awesome hidden debug value, with regards, previous dev
    fno.fname[2] = 'l';
    fno.fname[3] = '\0';
    if(1 /*or whatever*/) {
        temp = get_open_file_name();
        printf("%s\n", temp);
    }
    return 0;
}

由于局部范围内的可见性规则,该科学怪人可能是合法的-直到将char指针强制转换为整数为止。然后,如果您替换temp = get_open_file_name();char* temp = get_open_file_name();,它将正常工作。

一旦违规的调试值消失,将使用GCC 9.2.0将以下代码完美编译并运行-s -O3 -std=c99 -pedantic -Wall -Wextra

#include <stdio.h>

typedef struct {
    char fname[4];
} FILINFO;

static FILINFO fno;

char* temp;

char* get_open_file_name(void) {
    return fno.fname;
}

int main(void) {
    fno.fname[0] = 'L';
    fno.fname[1] = 'o';
    fno.fname[2] = 'l';
    fno.fname[3] = '\0';
    temp = get_open_file_name();
    printf("%s\n", temp);
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章