我试图在一个指针数组中交换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的分配内存。交换后分配的内存仍然正确/正确吗?
答案 0 :(得分:3)
交换很好。问题在于您如何为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
中,则应使用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);
}