簡體   English   中英

在C中將2個元素交換為一個指針數組(指向不同長度的字符串)

[英]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的分配內存。 交換后分配的內存是否仍然正確/正確?

交換很好。 問題是如何為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 charpointer 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM