0

一直在为一个学校项目使用 itoa(),它工作正常,然后开始抛出错误。说它在处理 itoa 的第一个实例时出现分段错误。

这是有问题的代码。

我不明白为什么它一开始会起作用,然后开始出现问题。我唯一添加的 pre-breakdown 是底部的一些 printf() 行,因为我已经在代码中注释掉了它们,但它仍然不起作用。

#include <stdio.h>
#include <stdlib.h>

int main()
{

//Variables

unsigned int byteH=0b00011001;
unsigned int byteL=0b00001110;
char* sValue;
char* sFreq;
float iConv;
char Output[4];
int i;


i=((byteH*32)+byteL);  // just adding two 5bit blocks together

itoa(i,sValue,10);     // This instance throws the segmenation error

iConv=((byteH*32)+byteL);
iConv=(int)(iConv/1.023);
i=(int)iConv;

itoa(i,sFreq,10);     // This instance doesn't cause problems.
4

2 回答 2

4

该函数itoa需要一个已分配的缓冲区。尝试:

char* sValue = malloc(20);

也是如此sFreq,即使它碰巧按原样“工作”。

于 2013-02-24T22:00:36.770 回答
1

虽然itoa()被定义为采用指针参数,但该指针必须指向一个足够大的内存块以接受结果。在您的情况下,指针是统一的。

最简单的解决方案是声明适当大小的数组。数组可以传递给接受指针参数的函数——它们是通过引用传递的,所以函数接收指向数组的指针,而不是它的副本。

char sValue[22] ;
char sFreq[22] ;

数组的大小足以接受带有潜在符号前缀的 64 位整数。对于 32 位,它只需要 12 个,但您也可以确保您不必知道代码将被编译为什么。

itoa 的替代方法是使用sprintf

sprintf( sValue, "%u", i ) ;
于 2013-02-24T22:47:49.570 回答