18

我在 C 示例中有这个结构:

typedef struct 
{
    const char * array_pointers_of_strings [ 30 ];
    // etc.
} message;

我需要将此 array_pointers_of_strings 复制到新数组以对字符串进行排序。我只需要复制地址。

while ( i < 30 )
{
   new_array [i] = new_message->array_pointers_of_strings [i]; 
   // I need only copy adress of strings
}

我的问题是:如何通过 malloc() 分配 new_array [i] 仅用于字符串地址?

4

4 回答 4

18

正如我从您在while循环中的赋值语句中可以理解的那样,我认为您需要字符串数组:

char** new_array;
new_array = malloc(30 * sizeof(char*)); // ignore casting malloc

注意:通过=在while循环中执行如下:

new_array [i] = new_message->array_pointers_of_strings [i];

你只是在分配字符串的地址(它不是深拷贝),但是因为你也在写“只有字符串的地址”所以我认为这就是你想要的。

编辑: 警告“分配丢弃来自指针目标类型的限定符”

您收到此警告是因为您分配的 aconst char*char* 违反 const 正确性规则。

你应该像这样声明你的 new_array:

const  char** new_array;      

从消息严格中删除const“array_pointers_of_strings”的声明。

于 2013-03-28T16:20:16.100 回答
6

这个:

char** p = malloc(30 * sizeof(char*));

将分配一个足够大的缓冲区来容纳 30 个指向char(或字符串指针,如果你愿意的话)的指针并分配给p它的地址。

p[0]是指针 0,p[1]是指针 1,...,p[29]是指针 29。


老答案...

如果我正确理解了这个问题,您可以通过简单地声明类型的变量来创建固定数量的它们message

message msg1, msg2, ...;

或者您可以动态分配它们:

message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
于 2013-03-28T16:18:25.730 回答
4
#include <stdio.h>
#include <stdlib.h>

#define ARRAY_LEN 2
typedef struct
{
    char * string_array [ ARRAY_LEN ];
} message;

int main() {
    int i;
    message message;
    message.string_array[0] = "hello";
    message.string_array[1] = "world";
    for (i=0; i < ARRAY_LEN; ++i ) {
        printf("%d %s\n",i, message.string_array[i]);
    }

    char ** new_message = (char **)malloc(sizeof(char*) * ARRAY_LEN);
    for (i=0; i < ARRAY_LEN; ++i ) {
        new_message[i] = message.string_array[i];
    }
    for (i=0; i < ARRAY_LEN; ++i ) {
        printf("%d %s\n",i, new_message[i]);
    }
}
于 2013-03-28T16:28:27.353 回答
1

您是否必须使用 Malloc?因为 Calloc 是 C 标准库中的函数,它将完成这项工作:

“calloc() 函数为每个大小字节的 nmemb 元素数组分配内存,并返回一个指向已分配内存的指针”。(来源:这里

我只是在创建一个哈希表,它有一个指向节点的指针数组,一个简单的方法是:

hash_table_t *hash_table_create(unsigned long int size){
hash_table_t *ptr = NULL;

ptr = malloc(sizeof(hash_table_t) * 1);
if (ptr == NULL)
    return (NULL);

ptr->array = calloc(size, sizeof(hash_node_t *)); #HERE
if (ptr->array == NULL)
    return (NULL);
ptr->size = size;
return (ptr);}

希望它对你们有用!

于 2020-05-29T22:44:29.203 回答