【问题标题】:void pointer in function [closed]函数中的空指针[关闭]
【发布时间】:2014-01-07 12:12:54
【问题描述】:

我在这个程序中遇到了 void 指针的问题(很抱歉不得不调出整个 bad 程序...)。

#include "stdafx.h"
void Input_int(int& InputVar, int Min = -2147483647, int Max = 2147483647);
void Output_array(void* Array, unsigned int ElementNumber, unsigned int Type = 0);
//Type = 0 => int, 1 => bool.
bool* Convert_decimal_to_binary(int n);

void main()
{
    int n;
    bool* binary;
    Input_int(n, -255, 255);
    binary = Convert_decimal_to_binary(n);
    printf("Binary's address: %d\n", binary);
    Output_array(binary, 8, 1);
}

void Input_int(int& InputVar, int Min, int Max)
{
    do {
        printf("Please input an integer in range [%d;%d]: ", Min, Max);
        scanf_s("%u", &InputVar);
        if (InputVar > Max || InputVar < Min) printf("Your number is out of the range!\n");
    } while (InputVar > Max || InputVar < Min);
}

bool* Convert_decimal_to_binary(int n)
{
    static bool Array[8];
    bool finishplus = false;
    if (n < 0)
    {
        int i;
        for (i = 7; i >= 0; i--)
        {
            if (n % 2 == 0) Array[i] = 0;
            else {
                if (!finishplus)
                {
                    Array[i] = 0;
                    finishplus = true;
                }
                else
                    Array[i] = 1;
            }
            n = n / 2;
        }
    }
    else {
        for (int i = 0; i < 8; i++)
        {
            if (n % 2 == 0) Array[i] = 0;
            else Array[i] = 1;
            n = n / 2;
        }
    }
    return Array;
}
void Output_array(void* Array, unsigned int ElementNumber, unsigned int Type)
{
    if (Type == 0)
    {
        int* ArrayR;
        ArrayR = (int*)Array;
        for (unsigned int i = 0; i < ElementNumber; i++)
            printf("Element %d got value: %d\n", i, ArrayR[i]);
    }
    else if (Type == 1)
    {
        bool* ArrayR;
        printf("Array's address (in Output_array) before type explicited: %d\n", Array);
        ArrayR = (bool*)Array;
        printf("Array's address (in Output_array) after type explicited: %d", Array);
        for (unsigned int i = 0; i < ElementNumber; i++)
            printf("%d", i, ArrayR[i]);
        printf("\n");
    }
}

这里的主要问题在于这 3 行的输出:

printf("Binary's address: %d\n", binary);
printf("Array's address (in Output_array) before type explicited: %d\n", Array);
printf("Array's address (in Output_array) after type explicited: %d", Array);

为什么第三个输出与其他输出不同?

例子:

二进制地址:11374900.
类型显式前的数组地址(在 Output_array 中):11374900。
类型明确后的数组地址(在 Output_array 中):1137490001234567。

在那里,"01234567" 总是出现。

提前致谢!

【问题讨论】:

  • 如果注释掉以下内容会发生什么:ArrayR = (bool*)Array;
  • 标记的 C++ - 为什么是 printf 等?还要避免使用void 指针,因为您会失去类型安全性。
  • 您忘记了最后一个 printf 上的 \n,所以它会附加您输出的下一个数字。
  • @OliCharlesworth:我加了一个例子,不知道是不是你建议的?

标签: c function void-pointers


【解决方案1】:

您忘记了最后一个printf 上的\n,因此它会附加您输出的下一个数字。指针本身很好。

【讨论】:

  • 非常感谢!很抱歉打扰了..
  • @ntvy95,一点也不烦人。很容易错过最简单的事情。
  • 看一个人的程序也很容易注意到非常明显的……程序显式地打印了这些数字;他们必须出现在输出somewhere
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2013-02-11
  • 1970-01-01
相关资源
最近更新 更多