我在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]?
答案 0 :(得分:14)
我可以从while循环中的赋值语句中理解,我认为你需要字符串数组:
char** new_array;
new_array = malloc(30 * sizeof(char*)); // ignore casting malloc
注意:在while循环中执行=
,如下所示:
new_array [i] = new_message->array_pointers_of_strings [i];
你只是分配字符串的地址(它不是深拷贝),但因为你也在写“只有字符串的地址”,所以我认为这就是你想要的。
编辑: waring “分配从指针目标类型中丢弃限定符”
您收到此警告是因为您要将const char*
分配给char*
,这违反了const-correctness规则。
你应该声明你的new_array:
const char** new_array;
或从message stricture中删除'array_pointers_of_strings'声明中的const
。
答案 1 :(得分:5)
此:
char** p = malloc(30 * sizeof(char*));
将分配一个足够大的缓冲区来容纳指向char
的30个指针(或者如果你愿意的话,还可以指定字符串指针),并将p
的地址分配给它。
p[0]
是指针0,p[1]
是指针1,......,p[29]
是指针29。
旧答案......
如果我正确理解了这个问题,您可以通过简单地声明message
类型的变量来创建固定数量的问题:
message msg1, msg2, ...;
或者您可以动态分配它们:
message *pmsg1 = malloc(sizeof(message)), *pmsg2 = malloc(sizeof(message)), ...;
答案 2 :(得分: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]);
}
}
答案 3 :(得分:1)
您必须使用Malloc吗?因为Calloc是C标准库中的函数,可以完成这项工作:
“ calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针”。。 (来源:here)
我只是在创建一个哈希表,它具有指向节点的指针数组,而执行此操作的一种简单方法是:
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);}
希望它对你们有用!