0

我正在编写一个 C 程序。我有一个名为的数据结构MyStruct,它包含一个字符指针和一个整数字段。MyStruct我有一个被调用的数组myArray。我需要的是MyStructure通过函数的结构简单地初始化这个数组initiateParams(),然后读取 myArray 的值并将它们显示在屏幕上displayParams()

该函数只是通过递增整数来initiateParams()初始化char*类变量的整数和字段。MyStruct初始化后,当我想通过displayParams()整数字段的值检索值时(intigerData)被正确检索;但指针字段 ( characterSet) 的值显示不正确;可能是char*分配给最后一个结构的最后一个值的值。如何正确检索指针值?谢谢你。

#include <stdio.h>
#include <stdlib.h>
//#include"structHeader.h"
#include <stdint.h>

void initiateParams();
void displayParams();
char* itoa(int value, char* result, int base);


typedef struct _MyStruct
{
    char* characterSet;
    uint16_t intigerData;
    uint16_t * intigerDataPtr;

} MyStruct;

const uint16_t bufferSize  =  400;
MyStruct myArray[400];
int main ()

{    initiateParams();
    displayParams();

    printf("ended");
    return 0;
}

void initiateParams(){
    uint16_t i;
    for(i = 0 ; i < 4*bufferSize ; i++){
        uint16_t k = i % bufferSize;
        MyStruct myStruct;
        myStruct.intigerData = i;
        char c;
        char* c2 = itoa(i , &c , 10);
        c = *c2;

        myStruct.characterSet = &c;
        myStruct.intigerDataPtr = & i;

        //printf("%s\r\n" , &dig);
        myArray[k] = myStruct;
    }
}

void displayParams(){
    uint16_t i;
    for(i = 0 ; i < bufferSize ; i++){
        MyStruct api = myArray[i]; 
        printf("retrieved integer value: %d , character pointer value: %s\r\n" 
                , api.intigerData , api.characterSet);
        printf("%s\r\n" , api.characterSet);
    }
}

/**
* C++ version 0.4 char* style "itoa":
* Written by Lukás Chmela
* Released under GPLv3.
*/
char* itoa(int value, char* result, int base) {
    // check that the base if valid
    if (base < 2 || base > 36) { *result = '\0'; return result; }

    char* ptr = result, *ptr1 = result, tmp_char;
    int tmp_value;

    do {
        tmp_value = value;
        value /= base;
        *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz" 
                [35 + (tmp_value - value * base)];
    } while ( value );

    // Apply negative sign
    if (tmp_value < 0) *ptr++ = '-';
    *ptr-- = '\0';
    while(ptr1 < ptr) {
            tmp_char = *ptr;
            *ptr--= *ptr1;
            *ptr1++ = tmp_char;
    }
    return result;
}
4

2 回答 2

2

这条线

 myStruct.characterSet = &c;

仅存储指向在堆栈上分配的临时变量“c”的指针。

您至少应该将“c2”变量的值(不带“*”)存储在字符集字段中。

此外,您没有分配缓冲区,将 &c 传递给 itoa 是错误的。

您应该(为每个字符)分配缓冲区:

    char* buf = malloc(10);
    myStruct.characterSet = itoa(i , buf , 10);

并在完成后释放结构(在 displayParams 之后)。

代码应该是

void initiateParams(){
    uint16_t i;
    for(i = 0 ; i < 4*bufferSize ; i++){
        uint16_t k = i % bufferSize;
        MyStruct myStruct;
        myStruct.intigerData = i;

        char* buf = malloc(10);
        myStruct.characterSet = itoa(i , buf , 10);
        myStruct.intigerDataPtr = & i;

        myArray[k] = myStruct;
    }
}
于 2013-01-26T16:27:15.807 回答
1

characterDataprint 失败,因为它指向的地址(变量c)只存在于initiateParams()

我认为您需要创建一个malloc,将值分配给新分配的字节并将后者的地址分配给characterSet指针。

或者更容易将characterSetfrom转换pointer to char为 simplechar并按值初始化。

于 2013-01-26T16:28:09.037 回答