Если вы пытаетесь выделить место для массива указателей, таких как
char** my_array_of_strings; // or some array of pointers such as int** or even void**
, тогда вам необходимо учитывать размер слова (8 байт в 64-битной системе, 4 байта в 32-битная система) при выделении места для n указателей.Размер указателя совпадает с размером вашего слова.
Так что, хотя вы можете выделить место для n указателей, на самом деле вам понадобится n раз 8 или 4 (для 64-разрядных или 32-разрядных).битовые системы, соответственно)
Чтобы избежать переполнения выделенной памяти для n элементов по 8 байтов:
my_array_of_strings = (char**) malloc( n * 8 ); // for 64-bit systems
my_array_of_strings = (char**) malloc( n * 4 ); // for 32-bit systems
Это вернет блок из n указателей, каждый из которых состоит из 8 байтов (или 4байт, если вы используете 32-битную систему)
Я заметил, что Linux позволит вам использовать все n указателей, когда вы не компенсируете размер слова, но когда вы пытаетесь освободить эту память, этопонимает свою ошибку и выдает эту довольно неприятную ошибку.И это плохо, когда вы переполняете выделенную память, многие проблемы безопасности подстерегают.