2013-12-08 1 views
0

Я массив выделяется таНос:Как узнать, указывают ли две C-строки на один блок памяти?

char *aStr1 = (char*) malloc (10); 

И тогда я заполнил эту память:

strcpy(aStr1, "ABCDEFGHI"); 

После этого я создал новый указатель aStr2:

char *aStr2 = aStr1 + 5; 

И я установил четвертый элемент памяти до '\ 0':

* (aStr1 + 4) = '\ 0';

И, наконец, используя эти два указателя в простой функции:

int checkMem(char *aStr1, char *aStr2); 

Эта функция возвращает TRUE (некоторые NONE нулевое значение), если aStr1 и aStr2 указал на один блок памяти, и возвращает ноль в другом случае.

Как я могу реализовать эту функцию? (Я прочитал много linux mans о функции allocs и не нашел никакой информации о такой проблеме).

// Добавлена ​​

мне это нужно сделать что-то вроде этого:

char *aStr1 = (char *) malloc (10); 
char *aStr2 = aStr1 + 5; 
strcpy(aStr1, "ABCDEFGHI"); 
*(aStr1 + 4) = '\0'; 

и чем:

my_strcat(aStr1, aStr2); 

Я не обратиться за помощью к реализации my_strcat, но может быть, получить подсказку, как я могу решить ее проблему.

// Обновлено

thanx, для всех. Я решил это.

Без каких-либо функций низкого уровня вы не можете правильно знают, сколько памяти выделяют (может быть, на какой-то платформе или реализации вы можете сделать это:

size_t ptr_size = *((size_t *)ptr - 1); 

но, возможно, не для всех это будет правильно).

И решение простое: я создаю локальную копию aSrc2, затем realloc aSrc1 и скопирую aSrc2 в новый aSrc1.

+3

Определите «Блок памяти» в этом контексте. – Sinkingpoint

+0

Если вы просто хотите определить, являются ли две строки сквозными в памяти, сравните адрес нулевого терминатора в одной строке с адресом начала другой строки. – lurker

+0

Дикая догадка, вы хотите знать, можете ли вы назвать 'free' на втором указателе или нет? – Johan

ответ

3

К сожалению, вы не можете сказать, указывают ли два указателя на память, принадлежащие к одному и тому же первоначальному распределению.

Вы можете создавать классы/структуры, которые, например, сохраняют начальное распределение, а затем вы можете сравнить их.

Но без дополнительной информации вы просто не можете сказать.

+0

И если я перераспределяю память на меньший размер, это уничтожает данные aStr2? или его неопределенное поведение? (Может быть, я имею в виду: будет ли указатель перемещаться в другое место, если я обрезаю память?) – Dumbledore

+0

если вы переделаете или сделаете что-нибудь указателю A, то указатель B не сможет знать или быть автоматически перемещен. Вы сталкиваетесь с неопределенным поведением с высокой вероятностью сбора данных и сбоев –

2

Для этого не предусмотрен стандартный механизм, который позволяет вам отслеживать полученную память и размеры этих распределений, поэтому вы, вероятно, захотите предоставить свою собственную оболочку malloc, которая отслеживает, что такое allocd. Храните указатели на карте, чтобы вы могли использовать lower_bound, чтобы найти ближайшее выделение для первой строки, а затем проверить, совпадает ли вторая строка с тем же распределением.

 Смежные вопросы

  • Нет связанных вопросов^_^