[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]

Файл: BS7QwVTVfwk.jpg -(87 KB, 960x960, BS7QwVTVfwk.jpg)
87 No.168330  

Взгляните на сей код на Ци. Посмотрите на GCC. Потом снова на сей код на Ци.
#include <stdio.h>
#include <stdlib.h>
``
int main(int argc, char const *argv[])
{

`int* a = (int*)calloc(100,sizeof(int));`
`a[200] = 10;`
`printf("%d\n", a[200]);`
`return 0;`

}
Где мои ошибки, что память не моя, трогать нельзя и всё такое?
Компилировал gcc version 4.9.2 (Debian 4.9.2-10), с флагом -std=c11.

>> No.168331  

>>168330
Кукла странно форматировала. http://pastebin.com/frRxkRXA

>> No.168333  

Это тебе не С#. Никаких проверок на выход за пределы массива в Си не делается.

>> No.168334  

>>168333
Я хотел криков от моего Линукса, что я нарушил сегментацию. Но, похоже, там сразу выделяется 128 кебибайт памяти, так что всё прошло на ура.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{

int* a = (int*)calloc(100,sizeof(int));
a[100000] = 10;
printf("%d\n", a[100000]);
return 0;

}
Вот уже этот код выдаёт Segmentation fault.

>> No.168359  

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

В общем, не указывай куда попало.

>> No.168429  

>>168334

> 128 кебибайт памяти

До того как маллоко-подобная штука вернёт память тебе, сначала нужно сделать страницу виртуальной памяти. В прыщах есть размеры страниц в 4к и 1м, твоё первое выделение делает 4к ммап скорее всего, а ты пытаешься обратиться всего к адресу 800 от начала той страницы, этот адрес конечно же существует.

Используй valgrind
(вот к примеру его вывод)

% valgrind ./a.out
==5859== Memcheck, a memory error detector
==5859== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==5859== Using Valgrind-3.11.0.SVN and LibVEX; rerun with -h for copyright info
==5859== Command: ./a.out
==5859==
--5859-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option
--5859-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 2 times)
--5859-- UNKNOWN mach_msg unhandled MACH_SEND_TRAILER option (repeated 4 times)
==5859== Invalid write of size 4
==5859== at 0x100000F34: main (test.c:7)
==5859== Address 0x10081e650 is 336 bytes inside an unallocated block of size 2,752 in arena "client"
==5859==
==5859== Invalid read of size 4
==5859== at 0x100000F42: main (test.c:8)
==5859== Address 0x10081e650 is 336 bytes inside an unallocated block of size 2,752 in arena "client"
==5859==

или используй clang для разработки, потому что его сообщения вменяемее чем у гцц
http://clang.llvm.org/docs/AddressSanitizer.html

>> No.168465  

>>168429

> AddressSanitizer

Он и в GCC есть, начиная с версии 4.8.

>> No.168472  

>>168429

>используй clang для разработки

Спасибо, но нет, спасибо.

>> No.168486  

>>168472
А чем не угодил clang?




[d | an-b-bro-fr-gf-hr-l-m-maid-med-mi-mu-ne-o-old_o-p-ph-r-s-sci-sp-t-tran-tv-w-x | bg-vg | au-mo-tr | a-aa-abe-azu-c-dn-fi-hau-jp-ls-ma-me-rm-sos-tan-to-vn | misc-tenma-vndev | dev-stat]
[Burichan] [Futaba] [Gurochan] [Tomorrow] [Архив-Каталог-RSS] [Главная]