gpt4 book ai didi

c - 正确检索 C 结构中的指针字段

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:11 25 4
gpt4 key购买 nike

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

initiateParams() 函数只是通过递增整数来初始化 MyStruct 类变量的整数和 char* 字段。初始化后,当我想通过 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;
}

最佳答案

这一行

 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;
}
}

关于c - 正确检索 C 结构中的指针字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com