7

几天前我刚开始学习 C,但我在使用指针时遇到了一些困难。我正在尝试将字符串转换为整数数组。下面的小片段似乎正在工作,但我收到警告:

在函数 '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 * 警告的唯一解决方案吗?

我确实检查了另一个“赋值从没有强制转换的指针中生成整数”主题/问题,但我无法从他们那里得到最终答案。

感谢您的帮助。

4

4 回答 4

8
unsigned int * int32result[1024]

unsigned int 声明一个包含 1024个指针的数组。我想你想要一个整数数组

unsigned int int32result[1024]

您有一个类似的问题,charToInt32其中unsigned int * int32result[]参数指定了一个数组unsigned int数组。您有一个数组,因此可以通过unsigned int * int32result(即删除[])。

您的其余代码应该可以正常工作。像这样的电话

charToInt32(clearText, int32result);

相当于

charToInt32(clearText, &int32result[0]);
于 2013-05-16T12:41:42.600 回答
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};

那里你也有太多的一级指针。

于 2013-05-16T12:42:33.307 回答
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 位的,这足以避免错误分配过程中的信息丢失。这就是为什么您的打印语句应该看起来像程序按预期工作的原因。

于 2013-05-16T12:46:29.707 回答
0
unsigned int * int32result[] 

是一个unsigned int指针数组,因此您将值分配给指针。

于 2013-05-16T12:44:13.800 回答