我在头文件中有以下结构:
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
只是一个疯狂的猜测,但是这样的事情会在这里起作用吗?
#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] 删除。
我来说两句