LINUX.ORG.RU

Гловальные переменные и выделение памяти


0

0

Всех Благ!

Пишу прогу на ANSI-C в которой надо использовать строковую глобальную переменную. Объявляю ее так:

char *scrdir;

main (int argc, char *argv[]) { FILE *inputval;

...

scrdir=(char *)malloc(sizeof(char)); strcpy (scrdir, "./scripts/");

printf("scrdir = '%s'\n",scrdir); // выводит что надо

.....

// input=“filename.txt” strcat(scrdir, input); printf("\nPATH:'%s'\n",scrdir); //все выводит как надо: 'полный_путь_к_файлу'

if(inputval = fopen(scrdir, "r")) { // и тут вываливается с ошибками

....

собственно вывод проги:

scrdir = './scripts/' PATH:'./scripts/spiceinput.txt' *** glibc detected *** ./opt: free(): invalid next size (normal): 0x0804e018 *** ======= Backtrace: ========= /lib/libc.so.6[0xb7d32911] /lib/libc.so.6(__libc_free+0x84)[0xb7d33f84] /lib/libc.so.6[0xb7d24620] /lib/libc.so.6(fopen+0x2c)[0xb7d2465c] ./opt[0x804b89c] [0x2747874] ======= Memory map: ======== 08048000-0804d000 r-xp 00000000 03:07 45214 /home/work/workspace/opt/Release/opt 0804d000-0804e000 rw-p 00004000 03:07 45214 /home/work/workspace/opt/Release/opt 0804e000-0806f000 rw-p 0804e000 00:00 0 [heap] b7b00000-b7b21000 rw-p b7b00000 00:00 0 b7b21000-b7c00000 ---p b7b21000 00:00 0 b7c79000-b7c7b000 rw-p b7c79000 00:00 0 b7c7b000-b7ca9000 r-xp 00000000 03:06 11282 /usr/local/lib/libgslcblas.so.0.0.0 b7ca9000-b7caa000 rw-p 0002d000 03:06 11282 /usr/local/lib/libgslcblas.so.0.0.0 b7caa000-b7ccd000 r-xp 00000000 03:01 15777 /lib/libm-2.4.so b7ccd000-b7ccf000 rw-p 00022000 03:01 15777 /lib/libm-2.4.so b7ccf000-b7de8000 r-xp 00000000 03:01 15769 /lib/libc-2.4.so b7de8000-b7dea000 r--p 00118000 03:01 15769 /lib/libc-2.4.so b7dea000-b7dec000 rw-p 0011a000 03:01 15769 /lib/libc-2.4.so b7dec000-b7def000 rw-p b7dec000 00:00 0 b7def000-b7df6000 r-xp 00000000 03:06 11858 /usr/local/lib/libool.so.1.0.0 b7df6000-b7df7000 rw-p 00006000 03:06 11858 /usr/local/lib/libool.so.1.0.0 b7df7000-b7f63000 r-xp 00000000 03:06 11386 /usr/local/lib/libgsl.so.0.9.0 b7f63000-b7f6d000 rw-p 0016b000 03:06 11386 /usr/local/lib/libgsl.so.0.9.0 b7f6d000-b7f6e000 rw-p b7f6d000 00:00 0 b7f79000-b7f83000 r-xp 00000000 03:01 20237 /lib/libgcc_s.so.1 b7f83000-b7f84000 rw-p 00009000 03:01 20237 /lib/libgcc_s.so.1 b7f84000-b7f85000 rw-p b7f84000 00:00 0 b7f85000-b7f9f000 r-xp 00000000 03:01 15762 /lib/ld-2.4.so b7f9f000-b7fa1000 rw-p 00019000 03:01 15762 /lib/ld-2.4.so bf9cb000-bf9e1000 rw-p bf9cb000 00:00 0 [stack] ffffe000-fffff000 ---p 00000000 00:00 0 [vdso] Аварийный останов ------------------------

Путь к программе (scrdir) выводится верный. Если вместо переменной scrdir указать сам путь, то файл открывается. Если прописать заведомо неверный - программа вываливается с аналогичным сообщением. Не понимаю в чем дело.

anonymous

> scrdir=(char *)malloc(sizeof(char)); strcpy (scrdir, "./scripts/");

может тебе K&R сперва почитать.

srcdir=(char *)malloc(sizeof(char)*(strlen("./scripts/")+1));

во вторых, sizeof(char) это всегда 1

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> во вторых, sizeof(char) это всегда 1

не всегда. к примеру, AFAIR для Watcom C можно было его с помощью ключей сборки делать и 2 байта. хотя применительно к gcc/g++ видимо всегда.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от dilmah

> sizeof(char) равен 1 по стандарту С++ (и С)

> это хорошо известный в узких кругах факт

Помимо этого, по стандарту sizeof возвращает размер обьекта в char-ах, так что даже если обычный char будет и 2 байта, то по стандарту sizeof(char) == 1 (ну а sizeof от 4х байтного int-а - будет 2 в таком случае)

fmj
()
Ответ на: комментарий от dilmah

>srcdir=(char *)malloc(sizeof(char)*(strlen("./scripts/")+1));

srcdir=(char *)malloc(sizeof(char)*(sizeof("./scripts/")));

В таком случае размер строки будет вычисляться ещё при компиляции (в отличие от strlen(), которая вычисляется при выполнении программы).

php-coder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.