Itoa в C с использованием Codeblocks вызывает ошибку сегментации

Играл с itoa() для школьного проекта, и он работал нормально, затем начал выдавать ошибки. Говорит, что имеет ошибку сегментации, когда обрабатывается первый экземпляр itoa.

Вот оскорбительный код.

Я не понимаю, почему это сработает, а потом начнутся проблемы. Единственное, что я добавил до разбивки, - это несколько строк 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.

2 ответа

Решение

Функция itoa ожидает, что уже выделен буфер. Пытаться:

char* sValue = malloc(20);

То же самое касается sFreq, даже если это произойдет, чтобы "работать", как есть.

В то время как itoa() определяется как получение аргумента указателя, этот указатель должен указывать на достаточно большой блок памяти, чтобы принять результат. В вашем случае указатели унифицированы.

Самое простое решение - объявить массивы подходящего размера. Массивы могут быть переданы функциям, принимающим аргументы указателя - они передаются по ссылке, поэтому функция получает указатель на массив, а не его копию.

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

Размер массива достаточен, чтобы принять 64-битное целое число с префиксом потенциального знака. Это должно быть только 12 для 32 бит, но вы также можете убедиться, что вам не нужно знать, для чего будет скомпилирован код.

Альтернативой Итоа было бы использовать sprintf:

sprintf( sValue, "%u", i ) ;
Другие вопросы по тегам