0

私はCプログラムを書いています。MyStruct文字ポインタと整数フィールドを含む というデータ構造があります。MyStructという配列がありmyArrayます。私が必要とするのは、関数によってMyStructure構造体によってこの配列を単純に初期化しinitiateParams()、次に myArray の値を読み取り、それらを によって画面に表示することdisplayParams()です。

このinitiateParams()関数は、整数をインクリメントすることによりchar*、クラスの変数の整数とフィールドを初期化するだけです。初期化後、整数フィールド( )の値でMyStruct値を取得したい場合、正しく取得されます。しかし、ポインター フィールド ( ) の値が正しく表示されませんでした。おそらく、最後の構造体に割り当てられた最後の値の値です。ポインター値を正しく取得するにはどうすればよいですか? ありがとうございました。displayParams()intigerDatacharacterSetchar*

#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'変数の値('*'なし)をcharacterSetフィールドに格納する必要があります。

また、バッファを割り当てていないため、&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

characterDatacのスコープ内にのみ存在するアドレス(変数)を指しているため、印刷は失敗しますinitiateParams()

を作成し、新しく割り当てられたバイトに値を割り当て、後者のアドレスをポインタmallocに割り当てる必要があると思います。characterSet

または、より簡単にcharacterSetからpointer to char単純に変換しcharて、値で初期化します。

于 2013-01-26T16:28:09.037 に答える