Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
1

При склеивании строк в цикле, уже на пятом цикле возникает переполнение памяти

16.06.2014, 12:34. Показов 1517. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При склеивании строк в цикле, уже на пятом цикле возникает переполнение памяти.

Что не так и как правильно сделать? Не пинайте нуба!

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
int main(int argc, char *argv[]) {
    int ret, i, a, n;
    char stop[50],drvandstops[600],buttons[200], strm[600], final[1024];
    
    
    strcpy(idsdb, argv[3]);             //${idsdb}
    strcpy(idsname, argv[4]);           //${idsname}
    strcpy(language, argv[5]);          //${language}
 
ret = msql_get(query);
   i=0;
    a=0;
    while(i != ret)
    {
        a++;
        memset(stop, 0x00, 50);        
        if(a == 10)
        {
            sprintf(stop,"button0",a);
        }
        else
        {
            sprintf(stop,"button%i",a);            
        }
 
        n = count_all(idsname, result[i][0]);
        if(n < 0)
        {
            return EXIT_FAILURE;           
        }     
        
        sprintf(drvandstops,"beep&address/%s/%s/stops/%i&address/%s/%s/automobils&/%s/digits/%i",idsname,language,a,idsname,language,language,n);
        sprintf(buttons,"&address/%s/%s/stopscl/button%i&",idsname,language,a);
        sprintf(strm,"%s%s",drvandstops,buttons);
    
        size_t len1 = strlen( final );
        size_t len2 = strlen( strm );
    
        char *buf = (char*)malloc( len1 + len2 + 1 );                // +1 для завершающего 0
    
        strcpy( buf, final );
        strcat( buf, strm );    
    
        sprintf(final,"%s",buf);
    
        free(buf);
         
        i++;
    }
 
}
При юзании PHP строка получается примерно такого вида и длинны (Все слитно):

"beep&address/owner/ru/seller-stend-intro&beep&beep&address/owner/ru/stops/1&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button1&beep&beep&address/owner/ru/stops/2&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button2&beep&beep&address/owner/ru/stops/3&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button3&beep&beep&address/owner/ru/stops/4&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button4&beep&beep&address/owner/ru/stops/5&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button5&beep&beep&address/owner/ru/stops/6&address/owner/ru/automobils&ru/digits/4&address/owner/ru/stopscl/button6&beep&beep&address/owner/ru/stops/7&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button7&beep&beep&address/owner/ru/stops/8&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button8&beep&beep&address/owner/ru/stops/9&address/owner/ru/automobils&ru/digits/6&address/owner/ru/stopscl/button9&beep&beep&address/owner/ru/stops/10&address/owner/ru/automobils&ru/digits/7&address/owner/ru/stopscl/button10&address/owner/ru/seller-final&address/general/ru/ballance&ru/digits/9&beep&address/owner/ru/seller-stend-intro&beep&beep&address/owner/ru/stops/1&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button1&beep&beep&address/owner/ru/stops/2&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button2&beep&beep&address/owner/ru/stops/3&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button3&beep&beep&address/owner/ru/stops/4&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button4&beep&beep&address/owner/ru/stops/5&address/owner/ru/automobils&ru/digits/1&address/owner/ru/stopscl/button5&beep&beep&address/owner/ru/stops/6&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button6&beep&beep&address/owner/ru/stops/7&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button7&beep&beep&address/owner/ru/stops/8&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button8&beep&beep&address/owner/ru/stops/9&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button9&beep&beep&address/owner/ru/stops/10&address/owner/ru/automobils&ru/digits/0&address/owner/ru/stopscl/button10&address/owner/ru/seller-final&address/general/ru/ballance&ru/digits/9"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2014, 12:34
Ответы с готовыми решениями:

Запись строк в текстовый файл в цикле при некотором условии
Проблема состоит в том что программа должна записывать данные( к-тую строку) с файла 1 в 3 но...

Как програмно в цикле не доходя до конца, пропустить шаг в цикле?
Как програмно в цикле не доходя до конца, пропустить шаг в цикле?

Переменная, которая только что использовалась в цикле в качестве счётчика в следующем цикле не используется
Помогите, пожалуйста. Вот отрывок программы (программа целиком- в архиве): procedure...

Почему начинающаяся с точки с запятой строка из текстовогого файла пропускается при разборе строк в цикле FOR?
Вот код: @echo off for /f &quot;usebackq delims=&quot; %%n in (&quot;12.txt&quot;) do ( echo %%n ) pause Вот...

8
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
16.06.2014, 18:48 2
Вы, вероятно, ожидаете, что здесь strlen() вернёт 1024, но это предположение неверно.
Цитата Сообщение от zoleg Посмотреть сообщение
C
1
size_t len1 = strlen( final );
Скорее всего, это будет 0, вследствие чего и возникает переполнение.

Попробуйте исправить код, например, так:
C
1
2
3
4
5
#define FINAL_LEN 1024
// ...
char final[FINAL_LEN];
// ...
char* buf = malloc(FINAL_LEN + len2 + 1);
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
16.06.2014, 18:59  [ТС] 3
К сожалению не помогло. На том же (пятом) цикле отвалилось выполнение с ошибкой "*** buffer overflow detected ***: "
0
40 / 37 / 15
Регистрация: 25.10.2012
Сообщений: 112
16.06.2014, 19:08 4
Хотелось бы поглядеть на вывод отладчика в таком случае.
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
16.06.2014, 22:59  [ТС] 5
Надеюсь это нужно ?! Это тот момен когда спотыкается. Ах, да - выводится с низу вверх!

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
__kernel_vsyscall()
__kernel_vsyscall+16: pop    %ebp
__kernel_vsyscall+17: pop    %edx
__kernel_vsyscall+18: pop    %ecx
__kernel_vsyscall+19: ret   
 
 
 
 
__GI_raise+104: test   %edi,%edi
__GI_raise+106: jg     0xb7b331cd <__GI_raise+61>
__GI_raise+108: test   $0x7fffffff,%edi
__GI_raise+114: je     0xb7b3321f <__GI_raise+143>
__GI_raise+116: neg    %edi
__GI_raise+118: jmp    0xb7b331cd <__GI_raise+61>
__GI_raise+143: mov    %ecx,%edi
__GI_raise+145: jmp    0xb7b331cd <__GI_raise+61>
__GI_raise+120: mov    -0x104(%ebx),%edx
__GI_raise+126: neg    %eax
__GI_raise+128: mov    %gs:0x0,%ecx
__GI_raise+135: mov    %eax,(%ecx,%edx,1)
__GI_raise+138: or     $0xffffffff,%eax
__GI_raise+141: jmp    0xb7b331e8 <__GI_raise+88>
__GI_raise+88: mov    (%esp),%ebx
__GI_raise+91: mov    0x4(%esp),%edi
__GI_raise+95: add    $0x8,%esp
__GI_raise+98: ret    
__GI_raise+99: nop
__GI_raise+100: lea    0x0(%esi,%eiz,1),%esi
 
__GI_abort()
__GI_abort+373: mov    %gs:0x8,%edx
__GI_abort+380: cmp    0x1190(%ebx),%edx
__GI_abort+386: je     0xb7b36859 <__GI_abort+425>
__GI_abort+388: xor    %eax,%eax
__GI_abort+390: mov    $0x1,%ecx
__GI_abort+395: cmpl   $0x0,%gs:0xc
__GI_abort+403: je     0xb7b36846 <__GI_abort+406>
__GI_abort+405: lock cmpxchg %ecx,0x1188(%ebx)
__GI_abort+413: jne    0xb7b368f1 <_L_lock_163>
__GI_abort+419: mov    %edx,0x1190(%ebx)
__GI_abort+425: addl   $0x1,0x118c(%ebx)
__GI_abort+454: movl   $0x4,0x1194(%ebx)
__GI_abort+432: lea    0x14(%esp),%edx
__GI_abort+436: xor    %eax,%eax
__GI_abort+438: mov    $0x23,%ecx
__GI_abort+443: mov    %edx,%edi
__GI_abort+445: rep stos %eax,%es:(%edi)
__GI_abort+447: lea    0x94(%esp),%eax
__GI_abort+464: movl   $0xffffffff,(%eax)
__GI_abort+470: sub    $0x4,%eax
__GI_abort+473: cmp    %edx,%eax
__GI_abort+475: jne    0xb7b36880 <__GI_abort+464>
 
__libc_message()
__libc_message+746: lea    -0x118(%ebp),%eax
__libc_message+752: movl   $0x40,0x4(%esp)
__libc_message+760: mov    %eax,(%esp)
__libc_message+763: call   0xb7c092d0 <__GI___backtrace>
__libc_message+771: mov    %eax,%esi
__libc_message+768: cmp    $0x2,%eax
__libc_message+773: jle    0xb7b70395 <__libc_message+741>
__libc_message+775: lea    -0x4419f(%ebx),%eax
__libc_message+784: mov    %eax,0x4(%esp)
__libc_message+788: mov    -0x524(%ebp),%eax
__libc_message+794: lea    -0x518(%ebp),%edi
__libc_message+800: movl   $0x1d,0x8(%esp)
__libc_message+808: mov    %eax,(%esp)
__libc_message+811: call   0xb7be34ca <__write_nocancel>
__libc_message+781: sub    $0x1,%esi
__libc_message+816: mov    -0x524(%ebp),%edx
__libc_message+822: lea    -0x114(%ebp),%eax
__libc_message+828: mov    %eax,(%esp)
__libc_message+831: mov    %esi,0x4(%esp)
__libc_message+835: mov    %edx,0x8(%esp)
__libc_message+839: call   0xb7c096c0 <__GI___backtrace_symbols_fd>
__libc_message+844: mov    -0x524(%ebp),%ecx
__libc_message+850: lea    -0x44181(%ebx),%eax
__libc_message+856: movl   $0x1d,0x8(%esp)
__libc_message+864: mov    %eax,0x4(%esp)
__libc_message+868: mov    %ecx,(%esp)
__libc_message+871: call   0xb7be34ca <__write_nocancel>
 
__kernel_vsyscall ()
__GI_raise (sig=6)
__GI_abort ()
__libc_message (do_abort=2, fmt=0xb7c686c7 \"*** %s ***: %s terminated\\n\")
__GI___fortify_fail (msg=0xb7c68648 \"buffer overflow detected\")
__GI___chk_fail ()
_IO_str_chk_overflow (fp=0xbfffe8a0, c=104)
_IO_default_xsputn (f=0xbfffe8a0, data=0x84587a8, n=655)
_IO_vfprintf_internal (s=0xbfffe8a0, format=<optimized out>, ap=0xbfffebf8 \"\")
___vsprintf_chk (s=0xbfffe984 \"\\n\\n buf = \\267@\\362\\377\\277\\\\\\365\\377\\277\\nbeep&taxi/berdichev/ru/stops/1&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton1&beep&taxi/berdichev/ru/stops/2&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton2&beep&taxi/berdichev/ru/stops/3&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton3&beep&taxi/berdichev/ru/stops/4&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton4&beep&taxi/berdichev/ru/stops/5&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton5&beep&taxi/berdichev/ru/stops/6&taxi/berdic\\277\", flags=1, flags@entry=1, slen=600, slen@entry=600, format=0x805fdf4 \"\\n\\n buf = %s \\n\\n\", format@entry=0x805fdf4 \"\\n\\n buf = %s \\n\\n\", args=0xbfffebf4 \"\\250\\207E\\b\", args@entry=0xbfffebf4 \"\\250\\207E\\b\")
vsprintf (__ap=0xbfffebf4 \"\\250\\207E\\b\", __fmt=0x805fdf4 \"\\n\\n buf = %s \\n\\n\", __s=0xbfffe984 \"\\n\\n buf = \\267@\\362\\377\\277\\\\\\365\\377\\277\\nbeep&taxi/berdichev/ru/stops/1&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton1&beep&taxi/berdichev/ru/stops/2&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton2&beep&taxi/berdichev/ru/stops/3&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton3&beep&taxi/berdichev/ru/stops/4&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton4&beep&taxi/berdichev/ru/stops/5&taxi/berdichev/ru/automobils&/ru/digits/0&taxi/berdichev/ru/stopscl/batton5&beep&taxi/berdichev/ru/stops/6&taxi/berdic\\277\")
debug (format=0x805fdf4 \"\\n\\n buf = %s \\n\\n\", format@entry=0x805fdf4 \"\\n\\n buf = %s \\n\\n\")
ast_tools_driver_count_all_driver_on_stop_for_ivr (argc=7, argc@entry=7, argv=0xbffff764, argv@entry=0xbffff764)
asterisk_tools_taxi (argc=7, argc@entry=7, argv=0xbffff764, argv@entry=0xbffff764)
main (argc=7, argv=0xbffff764)
Добавлено через 3 часа 41 минуту
Данных мало? Выложить всю "портянку"?
0
69 / 62 / 13
Регистрация: 10.01.2012
Сообщений: 508
17.06.2014, 23:40  [ТС] 6
Решилось тем, что не только буферу нужно было динамить, но и final потому, что в него пишется более чем [1024]
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
18.06.2014, 03:08 7
zoleg, как вариант:
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
32
33
34
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
char * rows_to_str(const char ** rows, size_t count) {
    char * buf;
    size_t len;
    
    if ( ! ( buf = calloc(1, 1) ) )
        return NULL;
    for ( len = 1; count; --count, ++rows ) {
        len += strlen(*rows);
        if ( ! ( buf = realloc(buf, len) ) )
            return NULL;
        strcat(buf, *rows);
    }
    
    return buf;
}
 
int main(void) {
    const char * array[] = { "Any ", "many ", "money ", "more." };
    char * str = rows_to_str(array, sizeof(array) / sizeof(*array));
    
    if ( ! str ) {
        fprintf(stderr, "Memory error!\n");
        exit(1);
    }
    
    printf("%s\n", str);
    free(str);
    
    exit(0);
}
И кстати, почему тема в разделе "для линукс"? Переложить в раздел "С", или таки есть причина?
0
430 / 384 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
08.07.2014, 13:34 8
Цитата Сообщение от easybudda Посмотреть сообщение
И кстати, почему тема в разделе "для линукс"?
В линуксе есть strlcat. Это мне приходится его эмулировать, как видите... Вроде нигде не напутал. Проверяйте!

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
32
33
34
35
36
37
38
39
40
41
#include <string.h>
 
#ifdef _WIN32
 
size_t strlcat(char* dst, const char* src, size_t siz)
{
    size_t dlen = strlen(dst);
    if( dlen >= siz ) { return dlen + strlen(src); }
    siz -= dlen;
    dst += dlen;
    char* s = (char*) src;
    while( *s && --siz ) {
        *dst++ = *s++;
    }
    *dst = '\0';
    return dlen + (s - src);
}
 
#endif
 
const char* multcat(const char* in[], const size_t in_siz, char* const out, const size_t out_len)
{
    out[0] = '\0';
    for( size_t i = 0; i < in_siz; ++i ) {
        if( strlcat(out, in[i], out_len) >= out_len ) {
            break; // произошла попытка выйти за пределы буфера
        }
    }
    return out;
}
 
int main(void)
{
    const char * array[] = { "Any ", "many ", "money ", "more." };
    char buf[10];
 
    multcat(array, sizeof(array) / sizeof(*array), buf, sizeof(buf));
    puts(buf);
 
    return 0;
}
0
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
17.09.2014, 19:26 9
Уважаемые склеильвальщики, не надо изобретать велосипед с маллоками и реалакоми. Есть функция open_memstream, она и память сама выделит сколько нужно и когда нужно, а ты просто добавляешь туда строки, будто в файл и в ус не дуешь при этом
0
17.09.2014, 19:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2014, 19:26
Помогаю со студенческими работами здесь

Оптимизирует ли компилятор выражения в цикле типа 90*M_PI или каждую итерацию в цикле считает заново?
Занялся сабжем по проекту. IDE Builder 2010 1) Оптимизирует ли компилятор выражения в цикле типа...

Как обратиться к уже созданным на форме label'ам в цикле?
Как обратиться к уже созданным на форме label'ам в цикле? наподобие label(i). А то так не работает.

Выделение памяти в цикле
Есть колл-во, нужно оптимизировать процесс: Car car1 = new Car(); Car car2 = new Car();...

В цикле возникает ошибка "String index out of range"
Итак, есть следующий код public class BreakDemo { public static void main(String args) { ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru