我几天前刚刚开始学习C,而且我在使用指针时遇到了一些困难。我正在尝试将字符串转换为整数数组。下面的小snipet似乎正在工作,但我收到了警告:
在函数'charToInt32'中 警告:赋值使得整数指针没有强制转换[默认情况下启用] | || ===构建完成:0个错误,1个警告(0分钟,0秒)=== |
警告来自
行int32result[pos] = returnedInteger;
所以我试图了解什么是最好的解决方案。我应该使用strncpy(但我可以使用strncpy作为整数吗?)或其他什么,或者我只是完全误解了指针?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int charToInt32(char * clearText, unsigned int * int32result[])
{
int i = 0, j = 0, pos = 0; /* Counters */
int dec[4] = {24, 16, 8, 0}; /* Byte positions in an array*/
unsigned int returnedInteger = 0; /* so we can change the order*/
for (i=0; clearText[i]; i+=4) {
returnedInteger = 0;
for (j=0; j <= 3 ; j++) {
returnedInteger |= (unsigned int) (clearText[i+j] << dec[j]) ;
}
int32result[pos] = returnedInteger;
pos++;
}
return pos;
}
int main()
{
int i = 0;
unsigned int * int32result[1024] = {0};
char * clearText = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
printf(">>Clear: %s\n", clearText);
charToInt32(clearText, int32result); // Do the conversion to int32.
printf(">>Int32 converted: ");
for (i=0; int32result[i]; i++)
printf("%u ", (unsigned int) int32result[i]);
printf("\n");
return 0;
}
另外,在程序结束时,我有以下几行:
printf("%u ", (unsigned int) int32result[i])
将int32result [i]强制转换为unsigned int是否是避免使用%u作为unsigned int *的另一个警告的唯一解决方案?
我确实检查了另一个“赋值使得指针没有投射的整数”主题/问题,但我无法从他们那里得到最终答案。
谢谢你的帮助。
答案 0 :(得分:8)
unsigned int * int32result[1024]
声明一个包含1024个unsigned int
指针的数组。我想你想在这里使用一系列的int来代替
unsigned int int32result[1024]
charToInt32
中存在类似的问题,其中unsigned int * int32result[]
参数指定了unsigned int
数组的数组。您有一个数组,因此可以通过unsigned int * int32result
(即删除[]
)。
其余代码应该正常工作。像
这样的电话charToInt32(clearText, int32result);
相当于
charToInt32(clearText, &int32result[0]);
答案 1 :(得分:2)
您声明charToInt32
将指针指向 - unsigned int
作为参数,
int charToInt32(char * clearText, unsigned int * int32result[])
但您将参数用作unsigned int
的数组,因此参数应为
unsigned int *int32result
或等效(在函数声明中!!不是一般的)
unsigned int int32result[]
在main
中,它应该是
unsigned int int32result[1024] = {0};
你也有一个指针级别太多了。
答案 2 :(得分:1)
您得到的警告来自于您为指针分配整数值的事实。
/* int32result is an array of POINTERS */
unsigned int * int32result[];
/* But returnedInteger is an int */
unsigned int returnedInteger = 0;
/*...*/
/* int32result[pos] is a pointer to an integer ...
* Thus here, you assign a "pure" integer to a pointer,
* hence the warning */
int32result[pos] = returnedInteger;
如果你没有强制转换值,编译器在点击printf时会发出警告也是完全合理的。事实上,普通机器上的指针通常是32位或64位,这足以避免在故障分配期间丢失信息。这就是为什么你的print语句看起来应该像预期的那样工作。
答案 3 :(得分:0)
unsigned int * int32result[]
是一个unsigned int
指针数组,因此您要将值赋给指针。