警告:赋值从指针生成整数而不进行强制转换。(warning: assignment makes integer from pointer without a cast. whats wrong?)
我收到了这个警告“警告:赋值从指针生成整数而没有强制转换”! 我想弄清楚这是什么意思? 我需要改变我的想法create_rectangle .....谢谢。 任何帮助赞赏
struct point {
int x;
int y;
};
struct rectangle {
struct point upperleft;
struct point lowerright;
char label[NAMESIZE + 1];
};
和我的代码:
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangle));
r->upperleft=ul;
r->lowerright=lr;
r->label[NAMESIZE+1]= strncpy(r->label,label,NAMESIZE);
//here is the warning
r->label[NAMESIZE] = '\0';
return r;
}
I got this warning "warning: assignment makes integer from pointer without a cast"! I want to figure out what does it mean? And what i need to change in my fucntion create_rectangle..... Thank you. Any help appreciated
struct point {
int x;
int y;
};
struct rectangle {
struct point upperleft;
struct point lowerright;
char label[NAMESIZE + 1];
};
and my code:
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangle));
r->upperleft=ul;
r->lowerright=lr;
r->label[NAMESIZE+1]= strncpy(r->label,label,NAMESIZE);
//here is the warning
r->label[NAMESIZE] = '\0';
return r;
}
原文:https://stackoverflow.com/questions/21489255
更新时间:2020-01-24 20:50
最满意答案
strncpy返回一个指向char的指针。 (实际上,您将其分配给非法地址,因为r->label[NAMESIZE+1]超出了数组的范围。)
它应该是
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangle));
r->upperleft=ul;
r->lowerright=lr;
strncpy(r->label,label,NAMESIZE);
r->label[NAMESIZE] = '\0';
return r;
}
strncpy returns a pointer which you are assigning to a char. (Actually, you are assigning it to an illegal address as r->label[NAMESIZE+1] is beyond the bounds of the array.)
It should be
struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangle));
r->upperleft=ul;
r->lowerright=lr;
strncpy(r->label,label,NAMESIZE);
r->label[NAMESIZE] = '\0';
return r;
}
2014-01-31
相关问答
纠正这个: socket = tcp_socket; 至 socket = tcp_socket(); tcp_socket()是函数调用,而tcp_socket是指向内存中函数位置的指针。 Correct this: socket = tcp_socket; to socket = tcp_socket(); tcp_socket() is a function call, while tcp_socket is a pointer to the function location in mem
...
在以下任务中 - result[0][index + 1] = "\0"; // 1
result[1][index] = "\0"; // 2
使用单引号' '而不是双引号。 ""用于字符串文字,其中result[1][index]和类似char是char ,因此,您会收到警告。 result[0][index + 1] = '\0'; /*
In this following assignment - resu
...
您的系统似乎将NULL定义为类似(void *)0 。 这意味着你的任务正在执行警告所说的 - 从没有强制转换的指针生成一个整数。 您不希望将NULL放入char变量中 - 您可能正在寻找: *s2 = '\0';
Your system appears to have NULL defined as something like (void *)0. That means your assignment is doing just what the warning says - making
...
您必须取消引用argv两次以获取char值numbers[i] = *(*(argv + i)); You have to dereference argv twice to get the char value numbers[i] = *(*(argv + i));
strncpy返回一个指向char的指针。 (实际上,您将其分配给非法地址,因为r->label[NAMESIZE+1]超出了数组的范围。) 它应该是 struct rectangle *create_rectangle(struct point ul, struct point lr,
char *label) {
struct rectangle *r = malloc(sizeof(struct rectangl
...
我不确定这是如何导致转换错误的,但我确实在您的代码中看到错误。 第一次调用strtok会初始化token'izer,因为你传递了一个缓冲区。 第二个调用,假设您希望它找到下一个标记,应该具有空值而不是相同的缓冲区。 看看这个例子...... 所以你想要的是: ...
int i=0;
str = strtok(buffer, " ");
do {
argv[i] = str; //**This line causes the warning!
...
} wh
...
如果hashtable是整数数组,则hashtable[i]需要一个整数, NULL是一个指针。 因此,您尝试将指针值分配给整数变量(没有-Werror转换),这通常只是一个警告,但由于您有 - -Werror所有警告都会变成错误。 只需使用0而不是NULL 。 If hashtable is an array of integers then hashtable[i] expects an integer and NULL is a pointer. So you're trying to as
...
如果你想让编译器静音,你必须添加类型转换(即使它通常是一个坏主意,这是你的编译器如何转换它)。 ssize_t *sys_call_table = (ssize_t *)0xc0026e04;
typedef ssize_t (*ftype)(const char *, int);
ftype orig_open;
ssize_t hacked_open(const char *pathname, int flags)
{
printf("SYS_OPEN called : %s\n
...
好吧,让我把它放在上下文中...... struct gdt_ptr
{
unsigned short limit;
unsigned int base;
} __attribute__((packed));
struct gdt_entry gdt[3];
struct gdt_ptr gp;
gp.base = &gdt;
您正在为整数( gp.base )分配指针( &gdt ) - 因此错误:-) 我怀疑你真的想要(或类似的东西): struct gdt_ptr
{
...
函数FindFirstVolume是未声明的,这使得编译器假设它返回int ,而实际上它应该返回HANDLE 。 你得到的警告特指你试图隐式地将int返回值转换为HANDLE类型( HANDLE实际上是指针类型)。 很可能在某些条件编译指令中隐藏了Windows API头中的FindFirstVolume声明。 您可能需要#define _WIN32_WINNT 0x0500来“启用”该函数的声明。 加 #define _WIN32_WINNT 0x0500
在包含Windows API标头之前
...