【问题标题】:Swapping 2 elements in an array of pointers (to strings of different length) in C在C中交换指针数组中的2个元素(到不同长度的字符串)
【发布时间】:2019-02-07 23:32:14
【问题描述】:

我正在尝试交换指针数组中的 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 的分配内存。交换后分配的内存是否仍然正确/正常?

【问题讨论】:

    标签: c arrays string memory malloc


    【解决方案1】:

    交换很好。问题是如何为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)。 Bellow 是代码的一个小工作版本。

    #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);
    }
    

    【讨论】:

    • 啊,好吧,我明白了。问题是在另一个函数中,我得到了一个字符串,我必须从中获取子字符串。出于这个原因,我正在使用 memcpy。我首先声明类似 char* a = malloc(N * sizeof(char*)) 的内容,然后声明 memcpy(a, originalString, n) 其中 n 是我从原始字符串中获取的字节数。如果我把它改成你的样子,char*a = malloc(stringlength), memcpy(a, originalString, n),然后添加到数组array[0] = a,这样可以吗?
    • @JackKelly 是的,就像你描述的那样没问题。字符串由指向char 的指针保存,每个字符只占用一个字节,因此您只需要malloc(n) 调用。 memcpy(a, originalString, n) 会将 n 字节从 originalString 复制到 a 字符串中。请注意,如果a 中的空间小于n,则会出现内存溢出(以下是未定义行为)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多