在C中将2个元素交换为一个指针数组(指向不同长度的字符串)

时间:2019-02-07 23:32:14

标签: c arrays string memory malloc

我试图在一个指针数组中交换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的分配内存。交换后分配的内存仍然正确/正确吗?

1 个答案:

答案 0 :(得分:3)

交换很好。问题在于您如何为ab指针分配内存,以及如何为它们分配字符串。不,当您使用交换算法时,内存块不会被打乱。如果您不更改ab,那么您会没事的(您正在做 )。在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);
}