使用 const 运算符发出警告(在结构中)
warning with const operator (in struct)
这可能是个菜鸟问题,但我不明白为什么我会收到警告
struct4.c:32:15:警告:赋值从指针目标类型中丢弃“const”限定符[默认启用] crea[i].size = wsize[i%5];
正在编译:
struct shirt {
char *size;
char *colour;
} ;
typedef struct shirt Camicia;
void loadshirt (Camicia * const crea, const char *wsize[] , const char *wcolour[]);
int main (void) {
Camicia collezione[50];
const char *sizearray[] = {"xs","s","m","l","xl"};
const char *colourarray[] = {"black","blue","yellow","orange"};
loadshirt(collezione,sizearray,colourarray);
printf("%s\n",collezione[4].size);
printf("%s\n",collezione[4].colour);
return 0;
}
void loadshirt (Camicia * const crea, const char *wsize[] , const char *wcolour[]) {
int i=0;
while (i<50) {
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
i++;
}
}
这里你的函数接受一个指向 Camicia 的 const 指针
void loadshirt (Camicia const * crea, const char *wsize[] , const char *wcolour[]) {
3 行后您尝试修改 crea :
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
你不能那样做。
当编译器说出类似 X discards 'const' qualifier
的内容时,它就是这个意思。某些东西是常量,但您正试图修改它,就好像它不是常量一样。
尝试理解编译器的错误消息很重要,您会节省很多时间。
现在,如果您想修复函数,首先需要从参数列表的 crea
中删除 const 限定符。
但也要注意这里的wsize和wcolour是const,而Camicia是这样定义的:
struct shirt {
char *size;
char *colour;
} ;
typedef struct shirt Camicia;
要么让你的结构 Camicia
存储 const char*,要么将其他参数修改为 char*。由于您在 main 中使用字符串文字,因此您可能希望所有内容都是 const char*.
你正在创建一个指向const
指针的non-const
指针,你不能修改const
指针指向的内容,但是如果你丢弃const
您可以通过新的 non-const
指针来完成限定符,因此编译器会警告您。
您将结构的数据成员定义为指向 非常量 字符串的指针。
struct shirt {
char *size;
char *colour;
} ;
但是在函数中,您将指向 const
个字符串的指针分配给指向 non-const
个字符串的指针
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
参见参数列表中wsize和wcolour的声明
const char *wsize[] , const char *wcolour[]
你不能那样做。
将数据成员定义为指向常量字符串的指针
struct shirt {
const char *size;
const char *colour;
} ;
或者将参数定义为具有指向非常量字符串的指针类型
char *wsize[] , char *wcolour[]
在这种情况下,您还必须更改相应参数的定义
char *sizearray[] = {"xs","s","m","l","xl"};
char *colourarray[] = {"black","blue","yellow","orange"};
在 C 中,字符串文字具有非常量数组的类型。
to avoid the runtime seg fault events,
the following code will work correctly.
this code takes into account that the arrays in main()
are actually an array of pointers to char* (I.E. strings)
#include <stdio.h>
#include <stdlib.h>
#define MAX_SHIRTS (50)
struct shirt {
const char *size;
const char *colour;
} ;
// struct shirt * const says the pointer is const,
// not that the contents of where the pointer points is const
void loadshirt (struct shirt * const, const char **, const char **);
int main (void) {
struct shirt collezione[MAX_SHIRTS];
// create two arrays of const pointers to consts
const char const *pSize[] = {"xs","s","m","l","xl"};
const char const *pColour[] = {"black","blue","yellow","orange"};
loadshirt(collezione, pSize, pColour);
printf("%s\n",collezione[4].size);
printf("%s\n",collezione[4].colour);
return 0;
}
void loadshirt (struct shirt * const crea, const char **pSize , const char **pColour)
{
int i=0;
for(i=0; i<MAX_SHIRTS; i++)
{
crea[i].size = pSize[i%5];
crea[i].colour = pColour[i%4];
}
}
这可能是个菜鸟问题,但我不明白为什么我会收到警告
struct4.c:32:15:警告:赋值从指针目标类型中丢弃“const”限定符[默认启用] crea[i].size = wsize[i%5];
正在编译:
struct shirt {
char *size;
char *colour;
} ;
typedef struct shirt Camicia;
void loadshirt (Camicia * const crea, const char *wsize[] , const char *wcolour[]);
int main (void) {
Camicia collezione[50];
const char *sizearray[] = {"xs","s","m","l","xl"};
const char *colourarray[] = {"black","blue","yellow","orange"};
loadshirt(collezione,sizearray,colourarray);
printf("%s\n",collezione[4].size);
printf("%s\n",collezione[4].colour);
return 0;
}
void loadshirt (Camicia * const crea, const char *wsize[] , const char *wcolour[]) {
int i=0;
while (i<50) {
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
i++;
}
}
这里你的函数接受一个指向 Camicia 的 const 指针
void loadshirt (Camicia const * crea, const char *wsize[] , const char *wcolour[]) {
3 行后您尝试修改 crea :
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
你不能那样做。
当编译器说出类似 X discards 'const' qualifier
的内容时,它就是这个意思。某些东西是常量,但您正试图修改它,就好像它不是常量一样。
尝试理解编译器的错误消息很重要,您会节省很多时间。
现在,如果您想修复函数,首先需要从参数列表的 crea
中删除 const 限定符。
但也要注意这里的wsize和wcolour是const,而Camicia是这样定义的:
struct shirt {
char *size;
char *colour;
} ;
typedef struct shirt Camicia;
要么让你的结构 Camicia
存储 const char*,要么将其他参数修改为 char*。由于您在 main 中使用字符串文字,因此您可能希望所有内容都是 const char*.
你正在创建一个指向const
指针的non-const
指针,你不能修改const
指针指向的内容,但是如果你丢弃const
您可以通过新的 non-const
指针来完成限定符,因此编译器会警告您。
您将结构的数据成员定义为指向 非常量 字符串的指针。
struct shirt {
char *size;
char *colour;
} ;
但是在函数中,您将指向 const
个字符串的指针分配给指向 non-const
个字符串的指针
crea[i].size = wsize[i%5];
crea[i].colour = wcolour[i%4];
参见参数列表中wsize和wcolour的声明
const char *wsize[] , const char *wcolour[]
你不能那样做。
将数据成员定义为指向常量字符串的指针
struct shirt {
const char *size;
const char *colour;
} ;
或者将参数定义为具有指向非常量字符串的指针类型
char *wsize[] , char *wcolour[]
在这种情况下,您还必须更改相应参数的定义
char *sizearray[] = {"xs","s","m","l","xl"};
char *colourarray[] = {"black","blue","yellow","orange"};
在 C 中,字符串文字具有非常量数组的类型。
to avoid the runtime seg fault events,
the following code will work correctly.
this code takes into account that the arrays in main()
are actually an array of pointers to char* (I.E. strings)
#include <stdio.h>
#include <stdlib.h>
#define MAX_SHIRTS (50)
struct shirt {
const char *size;
const char *colour;
} ;
// struct shirt * const says the pointer is const,
// not that the contents of where the pointer points is const
void loadshirt (struct shirt * const, const char **, const char **);
int main (void) {
struct shirt collezione[MAX_SHIRTS];
// create two arrays of const pointers to consts
const char const *pSize[] = {"xs","s","m","l","xl"};
const char const *pColour[] = {"black","blue","yellow","orange"};
loadshirt(collezione, pSize, pColour);
printf("%s\n",collezione[4].size);
printf("%s\n",collezione[4].colour);
return 0;
}
void loadshirt (struct shirt * const crea, const char **pSize , const char **pColour)
{
int i=0;
for(i=0; i<MAX_SHIRTS; i++)
{
crea[i].size = pSize[i%5];
crea[i].colour = pColour[i%4];
}
}