【发布时间】:2015-06-30 14:04:15
【问题描述】:
我有一个名为nodes 的结构数组。每个节点都包含一个 void 指针字段。
在一个函数中,我获取特定节点并将 void 指针分配给一个字符串,该字符串包含已转换为二进制的十进制结果。
问题是在函数中访问和打印转换为 char* 的 void 指针可以正常工作,以将 void* 分配给新的 char* 并且在返回主函数时打印正常。但是,当我尝试在以节点 [] 和数组索引作为参数的单独函数中打印它时,它无法正确打印。
为了帮助阐明混淆,这是我的程序的简化版本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define listSize 100
typedef struct Node
{
union{
void *dataPtr;
int countr;
}dataItem;
int link;
}node;
void loadData(node*);
void printFunc(node[], int);
void main()
{
struct Node Stack[listSize];
loadData(&Stack[0]);
//This prints fine
char * temp;
temp = (char*)(Stack[0].dataItem.dataPtr);
printf("\nMain(): Stack[empty].dataItem.dataPtr = %s\n", temp);
printFunc(Stack, 0);
}
void loadData(node* link){
char string[220];
int n, c, k, i;
printf("Enter an integer: ");
scanf("%d", &n);
i = 0;
for (c = 31; c >= 0; c--)
{
k = n >> c;
if (k & 1){
string[i] = '1';
i++;
}
else{
string[i] = '0';
i++;
}
if (c == 0){ string[i] = '\0'; }//end the string
}
link->dataItem.dataPtr = &string;
//This prints fine:
printf("\nLoadData(): link->dataItem.dataPtr is now %s\n", (char *)(link->dataItem.dataPtr));
}
void printFunc(node Stack[], int newLink){
//This does not work!
char* temp;
temp = (char*)(Stack[newLink].dataItem.dataPtr);
printf("\npush(): Stack[newLink].dataItem.dataPtr %s\n", temp);
}
输出:
我也在 Visual Studios 2012 中进行编译。我知道有时 GCC 中指向 Microsoft C 编译器的指针可能会有所不同。
我在写什么导致程序无法在 printFunc 函数中将 void* 转换为 char* 打印?
【问题讨论】:
-
link->dataItem.dataPtr = &string;- 这行不通。首先,您不需要&,因为本地数组将衰减为指针。其次,更重要的是,您将本地数组分配给要在其范围之外使用的指针。这是未定义的行为。
标签: c arrays pointers void-pointers