[英]Swapping 2 elements in an array of pointers (to strings of different length) in C
我試圖在一個指針數組中交換2個元素,並且這些指針指向不同長度的字符串。 另一個函數負責為數組和字符串分配內存,交換函數將簡單地采用char **數組並交換我需要交換的元素。 我想知道的是,當我交換指針時,是在交換時為每個字符串保留分配的內存還是弄亂了?
這不是我的項目中的確切代碼,但是它的作用是相同的:
int main() {
char** array = malloc(10 * sizeof(char*));
char* a = (char*)malloc(4*sizeof(char*));
char* b = (char*)malloc(14*sizeof(char*));
a = "test";
b = "this is a test";
array[0] = a;
array[1] = b;
char*temp;
temp = array[0];
array[0] = array[1];
array[1] = temp;
free[array];
free[a];
free[b];
return 0;
}
太概括了,我的問題是關於a和b的分配內存。 交換后分配的內存是否仍然正確/正確?
交換很好。 問題是如何為a
和b
指針分配內存,以及如何為它們分配字符串。 不,當您使用交換算法時,內存塊不會被打亂。 如果您不更改a
和b
,那么您會很好(您正在執行的操作)。 在C語言中,事情是這樣的:
char *a = malloc(4 * sizeof(char));
a = "test"; // this is an error, and you will lose the memory block
這將分配4個內存單元,每個內存單元大小為char
。 當您這樣做時:
char *a = malloc(4 * sizeof(char**));
這將分配4個內存單元,每個內存單元的大小為char *
或char
的指針。 這不是您想要的。 此外,如果要將字符串放在pointer to char
的pointer to char
,則應使用strncpy
函數(或strndup
如果可用))。
char *a = malloc(5 * sizeof(char)); // always alloc space for the NULL byte
strncpy(a, "test", 4);
char *b = strndup("test", 4);
free(a);
free(b);
請注意,您確實以正確的方式為指針數組分配了內存,方法是:
char **array = malloc(10 * sizeof(char*));
...將為您提供10個內存塊的塊,每個內存塊的大小為char *
。 然后,您可以通過索引array
指針來尋址這些內存單元中的每一個。
夫婦指針(無雙關語):首先,您不需要malloc
的返回值。 其次,您不需要乘以sizeof(char)
。 波紋管是代碼的一點工作版本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char **array = malloc(10 * sizeof(char*));
char *a = malloc(5);
char *b = malloc(15);
strcpy(a, "test");
strcpy(b, "this is a test");
char *temp;
array[0] = a;
array[1] = b;
// prints "test" then "this is a test"
printf("%s\n%s\n\n", array[0], array[1]);
// this swaps them
temp = array[0];
array[0] = array[1];
array[1] = temp;
// now it prints "this is a test" and "test"
printf("%s\n%s\n\n", array[0], array[1]);
free(a);
free(b);
free(array);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.