С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
1

Corrupted stack

10.02.2017, 11:21. Показов 487. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброе утро, форумчане, подскажите где я накосячил со стэком?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
 
char GetAddress(char **file_content) {
    char slaveAddr;
    
    sscanf((*file_content), "%2X", &slaveAddr);
    slaveAddr = (slaveAddr >> 1);
    (*file_content)+=2;
    unsigned int addr = (unsigned int)&slaveAddr; // моя проверка, чтобы посмотреть что переменная правда в памяти есть
    return slaveAddr;
}
 
int main() {
    
    char* file_content = "3245678"; 
    char slaveAddr = GetAddress(&file_content);
 
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2017, 11:21
Ответы с готовыми решениями:

Stack around the variable was corrupted
Непонятно, почему возникает данная ошибка, причем она возникает на том моменте, когда уже нет...

Stack around the variable was corrupted
void main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); double c,x,y,f; char k;...

Stack around the variable 'e' was corrupted
Программа работает, но после закрытия консоли пишет ошибку &quot;Stack around the variable 'e' was...

Stack around the variable 'i' was corrupted
Создать массив указателей на функцию. Ввести цифру, которая обозначает функцию, которую необходимо...

11
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.02.2017, 12:03 2
Нет, я все таки был прав, вы в строке 9 изменяете значение из блока памяти, доступной только для чтения.
0
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
10.02.2017, 12:10  [ТС] 3
Цитата Сообщение от HighPredator Посмотреть сообщение
Вы передали в GetAddress() адрес read-only переменной т.к. file_content указывает на блок памяти доступный только для чтения.
я так понял что file_content нужно в памяти malloc'oм выделить и тогда она будет доступна для записи?
0
25 / 25 / 5
Регистрация: 04.01.2017
Сообщений: 52
10.02.2017, 12:12 4
andreyka93, вот в разделе по C++ похожая тема:
Не получается присвоить значение элементу массива указателей типа char *a[3]
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.02.2017, 12:21 5
1)
C
1
char file_content[] = "3245678";
2) зачем вам в функции указатель на указатель? вы же значение указателя не меняете.
1
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
10.02.2017, 12:27  [ТС] 6
как тогда хранить содержимое файла? я считываю все что в .тхт файле в char*, и потом этот char* хочу прогнать через много функций и распарсить содержимое. Вот моя функция чтения
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
char* Get_file_content(uint8 *file_name, int *content_length){
        
    int i;
    char *file_content = NULL;
    FILE *inputfile;
    inputfile = fopen((char*)file_name, "r");
    
    if (!inputfile)
    {
        printf("Error opening file\n");
        return 0;
    }
    
    fseek(inputfile, 0, SEEK_END);
    i = ftell(inputfile);
    fseek(inputfile, 0, SEEK_SET);
    file_content = (char*)calloc(i, sizeof(char));
    
    if (file_content){
        fread(file_content, 1, i, inputfile);
    }
    file_content[i] = '\0';
    *content_length = i;
    fclose(inputfile);
 
    if (content_length == 0) {
        printf("File is empty");
        return 0;
    }
    return file_content;
}
все считывает хорошо, у меня задумка следующая, допустим содержимое файла
123456, и у меня есть три функции
C
1
2
3
4
5
6
7
8
9
10
11
12
int ReadFirst2Bytes(char**file_content){
//...
(*file_content)+=2;     // вот ради чего двойной указатель
}
int ReadSecond2Bytes(char**file_content){
//...
(*file_content)+=2;
}
int ReadThird2Bytes(char**file_content){
//...
(*file_content)+=2;
}
и в функции main
C
1
2
3
4
5
6
7
8
9
int main(){
   int content_length = 0;
   int result1, result2, result3;
   char *file_content = NULL;
   file_content = Get_file_content(file_name, &content_length);
   result1 = ReadFirst2Bytes(&content_length);
   result2 = ReadSecond2Bytes(&content_length);
   result3 = ReadThird3Bytes(&content_length);
}
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.02.2017, 13:35 7
Цитата Сообщение от andreyka93 Посмотреть сообщение
как тогда хранить содержимое файла?
Ну как бы в основном посте никакой файл не фигурировал. Вы можете определить размер файла, и если он "вменяемый", выделить буфер нужного размера, считать в него контент, а затем уже делать с ним все что хотите.
0
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
10.02.2017, 13:49  [ТС] 8
Цитата Сообщение от HighPredator Посмотреть сообщение
Ну как бы в основном посте никакой файл не фигурировал. Вы можете определить размер файла, и если он "вменяемый", выделить буфер нужного размера, считать в него контент, а затем уже делать с ним все что хотите.
Подскажите как внутри функций передвигать указатель переданный в нее без двойного указателя?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.02.2017, 14:28 9
Цитата Сообщение от andreyka93 Посмотреть сообщение
внутри функций передвигать указатель
1) Зачем?
2) Покажите (можно схематично) что вы имеете ввиду
1
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
10.02.2017, 16:36  [ТС] 10
Цитата Сообщение от HighPredator Посмотреть сообщение
1) Зачем?
2) Покажите (можно схематично) что вы имеете ввиду
спасибо за предложенную помощь, я вот какую ссылку нашел
https://www.thecodingforums.co... ng.732541/

там похожая проблема была, и в ответе объяснили почему появляется ошибка "stack around the variable was
corrupted" очень опасная функция sscanf(...)
0
Вездепух
Эксперт CЭксперт С++
12803 / 6678 / 1797
Регистрация: 18.10.2014
Сообщений: 16,903
10.02.2017, 18:32 11
Цитата Сообщение от HighPredator Посмотреть сообщение
вы в строке 9 изменяете значение из блока памяти, доступной только для чтения.
Нет, коненчо. В строке 9 меняется значение указателя file_content из main, который сам по себе является обычной переменной, доступной для модификации.

Цитата Сообщение от HighPredator Посмотреть сообщение
2) зачем вам в функции указатель на указатель? вы же значение указателя не меняете.
Это как это? Именно значение указателя автор и хочет поменять.

Цитата Сообщение от andreyka93 Посмотреть сообщение
C
1
2
char slaveAddr;
sscanf((*file_content), "%2X", &slaveAddr);
Спецификатор формата X требует аргумента типа unsigned int *. А передается char *. Вот и ваше повреждение стека.

И почему это вдруг char, когда даже не вникая в суть задачи понятно, что нужен беззнаковый тип?

Либо

C
1
2
unsigned slaveAddr;
sscanf(*file_content, "%2X", &slaveAddr);
либо

C
1
2
unsigned char slaveAddr;
sscanf(*file_content, "%2hhX", &slaveAddr);
2
131 / 131 / 157
Регистрация: 11.04.2015
Сообщений: 343
10.02.2017, 19:09  [ТС] 12
Хотел по хитрому по два char'a в hex преобразовать, так пришлось полдня потратить на поиск проблемы этой, и она у меня еще и была в старой программе, там я написал отдельный велосипед вместо этого для преобразования, ну а так очень хорошо замечать такие тонкости, спасибо за советы!
0
10.02.2017, 19:09
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.02.2017, 19:09
Помогаю со студенческими работами здесь

Задание со структурой - Stack around the variable 'd' was corrupted
В конце программы выдает такую ошибку : Run-Time Check Failure #2 - Stack around the variable 'd'...

Run-Time Check Failure #2 - Stack around the variable 'y' was corrupted
Даны два строго упорядоченных по возрастанию массива X и Y из n элементов каждый. В массиве X найти...

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
Выдает ошибку &quot;Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.&quot;...

Run-Time Check Failure #2 - Stack around the variable 'dht' was corrupted
Всем доброго времени суток! Недавно начал программировать на C в среде Microsoft Visual C++....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru