У меня есть массив структур, называемый node
s. Каждый узел содержит поле указателя пустоты.Печать (Char *) (Void *) работает в основной программе, но не работает
В функции я беру конкретный узел и назначаю указатель void на строку, содержащую результат десятичного числа, которое было преобразовано в двоичное.
Проблема заключается в том, что доступ и печать указателя void, переданного char *, отлично работает в функции, чтобы назначить void * новому символу * И печатает отлично при возврате к основной функции. Однако он не печатает правильно, когда я пытаюсь напечатать его в отдельной функции, которая принимает узел [] и индекс массива в качестве аргументов.
Чтобы осветить путанице это упрощенная версия моей программы:
#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. Я знаю, что иногда указатели в НКУ к Компилятор Microsoft C может быть немного другим.
Что я пишу, что делает программу неспособной печатать пустоту * отличить как символ * в функции printFunc
?
'ссылка-> dataItem.dataPtr = & строки;' - это не работает. Во-первых, вам не нужно '&', потому что локальный массив распадается на указатель. Во-вторых, и что более важно, вы назначаете локальный массив указателю, который будет использоваться вне его области. Это неопределенное поведение. –