我有一个名为node
s的结构数组。每个节点都包含一个void指针的字段。打印(Char *)(void *)在主程序中运行,但不起作用
在一个函数中,我使用特定的节点并将void指针指定给一个字符串,该字符串包含已转换为二进制的十进制结果。
问题是,访问和打印无效指针强制转换为char *可以在函数中将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);
}
输出:
我也编译在视觉工作室2012年我知道有时候三分球GCC到微软C编译器可能有点不同。
我在写什么,使程序无法在printFunc
函数中打印void *作为char *投射?
'link-> dataItem.dataPtr =&string;' - 这是行不通的。首先,你不需要'&',因为本地数组会衰减为一个指针。其次,更重要的是,您将一个本地数组分配给一个指向其范围之外的指针。这是未定义的行为。 –