繁体   English   中英

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

[英]Returning a pointer to a char array inside a struct in C?

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

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;

现在我想要某个 function 返回指向 fname[] 的指针,这应该是可能的,因为结构定义为 static。 这是我的 function:

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

我从 main 中调用这个 function,如下所示:

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

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

#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;
}

由于本地范围的可见性规则,这个 frankenstein 可以是合法的 - 当然,直到将 char 指针强制转换为 integer 为止。 那么如果你替换temp = get_open_file_name(); with 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM