Почему происходит ошибка сегментации?
Суть задачи: Написать функцию с переменным числом аргументов, вычисляющую сумму
переданных чисел в заданной системе счисления. Примечание: десятичное
представление чисел может быть слишком велико и не поместиться в типы
int, long int и т. д. Для решения возникшей проблемы напишите функцию
«сложения в столбик» чисел в заданной системе счисления.
И казалось бы все работает, но если передавать в amount строки из 2 и более элементов,то программа крашится. Причем самое удивительное, что в дебаге все идеально работает.
Из мыслей было такое
char *amount = (char *) malloc(sizeof(char *) * 1000);
char *s3 = (char *) malloc(sizeof(char *) * 1000);
Но лучше не стало
Помогите найти баг
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
int digit_to_char(int num)
{
if (num <= 9 && num >= 0)
return '0' + num;
else
return 'A' + num - 10;
}
int char_to_digit(int chr)
{
if (chr >= '0' && chr <= '9')
return chr - '0';
else
return chr + 10 - 'A';
}
void reverse_str(char *str)
{
for (int i = 0; i < strlen(str) / 2; ++i)
{
char t = str[i];
str[i] = str[strlen(str) - i - 1];
str[strlen(str) - i - 1] = t;
}
}
void swap(char* s1, char* s2,int* a, int* b)
{
char *tmp;
int t;
tmp = s2, s2 = s1, s1 = tmp;
t = *a, *a = *b, *b = t;
}
char* sum(char* s1, char* s2,int cc)
{
// printf("12s");
int ost = 0;
int sum;
int j,i;
int n1 = strlen(s1),n2 = strlen(s2);
if (n1 > n2)
{
swap(s1,s2,&n1,&n2);
}
char* rez_buf = (char*)malloc(sizeof(char *) * n2 + 1);
reverse_str(s1);
reverse_str(s2);
for (i = 0; i < n1; ++i)
{
sum = (char_to_digit(s1[i])) + (char_to_digit(s2[i])) + ost;
rez_buf[i] = digit_to_char(sum % cc);
ost = sum / cc;
}
for (j = 0; j < n2 - n1; ++j,++i)
{
sum =(s2[i] - '0') + ost;
rez_buf[i] = sum % cc + '0';
ost = sum / cc;
}
if (ost)
rez_buf[i] = digit_to_char(ost);
reverse_str(rez_buf);
return rez_buf;
}
char* amount(int cc,int count,...)
{
va_list vl;
va_start(vl,count);
char* s3;
char *amount = va_arg(vl, char *);
char *tmp_value = va_arg(vl, char *);
for (int i = 0; i < count - 1; ++i)
{
s3 = sum(amount,tmp_value,cc);
amount = s3;
}
return amount;
}
int main()
{
char* gg = "10";
char* gg2 = "11";
char* rez = amount(10,2,gg,gg2);
printf("%s",rez);
free(rez);
return 0;
}
Ответы (1 шт):
Проблема здесь:
char* gg = "10";
char* gg2 = "11";
Указатели gg и gg2 указывают на неизменяемые строковые литералы. Изменение строковых литералов является неопределенным поведением. Вы их меняете в reverse_str и происходит ошибка сегментации — попытка записи в неизменяемый сегмент памяти.
Сделайте их массивами:
char gg[] = "10";
char gg2[] = "11";