我正在尝试创建一个程序,该程序使用通过终端传递的参数来填充固定大小的参数数组。我的第一步是尝试创建并填充默认参数字符串数组,这是我成功完成的。但是,我现在正尝试使用malloc()
为该数组分配空间,并且无法对其进行编译。关于正确的语法,我已经尝试了所有可以想到的方法。我尝试对malloc()
进行更多研究,以及如何将其用于二维数组,但我没有找到任何对我有帮助的信息。我被卡住了,不确定下一步该怎么做。这是代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_NUM_OF_ARGS 5
#define MAX_ARG_SIZE 256
int main(int argc, char **argv) {
printf("%s%d\n", "Length: ", argc); //for debug purposes
// Make sure we don't have more than five arguments
if(argc > MAX_NUM_OF_ARGS) {
printf("%s", "Too many arguments. Must enter fewer than 4.");
}
// Populate the array
else{
char defaultArgs[] = "defaultArgs"; //create default argument array
//allocate memory for default array
char argumentArray[MAX_NUM_OF_ARGS][MAX_ARG_SIZE] =
(char *)malloc(MAX_NUM_OF_ARGS * MAX_ARG_SIZE * sizeof(char));
//populate array with default arguments
for (int i = 0; i < MAX_NUM_OF_ARGS; i++) {
strcpy(argumentArray[i], defaultArgs);
printf("%s\n", argumentArray[i]);
}
free(argumentArray);
return 0;
}
}
当我尝试编译时,在char*
的(malloc()
)强制转换时收到无效的初始化错误。我尝试将其强制转换为(char**
和(char
),还将sizeof(char)
更改为sizeof(char*)
和sizeof(char**)
。
我现在还不确定我做错了什么,我甚至不知道下一步该怎么做。
答案 0 :(得分:2)
您已将argumentArray
声明为char
的二维数组。 malloc
函数返回一个指针,因此您不能将指针分配给该数组的元素。
您需要一个指针来存储要返回的内容。实际上,在这种情况下,您需要一个指向指针的指针,并且需要多次调用malloc
,一次调用参数的指针数组,然后再次循环每个参数:
char **argumentArray = malloc(MAX_NUM_OF_ARGS * sizeof(char *));
for (int i=0; i<MAX_NUM_OF_ARGS; i++) {
argumentArray[i] = malloc(MAX_ARG_SIZE);
strcpy(argumentArray[i], defaultArgs);
printf("%s\n", argumentArray[i]);
}
答案 1 :(得分:2)
您不能在C中存储字符串数组,因为字符串是可变长度的数据结构,而不是简单的类型。
因此,决定您想要什么:
固定长度的缓冲区数组,用于存储固定(最大)长度的字符串。
char (*p)[MAX_LEN] = malloc(n * sizeof *p);
// Store the strings at p[0], p[1], …, p[n - 1]
一个连续存储任意数量字符串的缓冲区。
char* p = malloc(sum_of_string_lengths + count_of_strings);
// Now fill in the strings one after the other, including Terminator
指向字符串的指针数组。
char** p = malloc(n * sizeof *p);
p[0] = strdup(source[0]);
// ...
// p[n - 1] = ...
使用strdup()
定义的通用实用程序功能如下:
char* strdup(const char* s) {
size_t n = strlen(s) + 1;
char* r = malloc(n);
if (r)
memcpy(r, s, n);
return r;
}
答案 2 :(得分:0)
尝试这样思考:
这里是一个使char *数组化的示例。本质上,malloc返回的指针指向char *将驻留的区域。这是正在发生的情况的说明。
/*
malloc_ret_ptr ---> [ char * my_str1 | char * my_str2 | char * my_str3 ]
| | |
| | |
v v v
"Thank" "You" "Chicago"
*/
int main() {
char * my_string = "this is my string";
char ** my_string_array;
my_string_array = malloc(sizeof(char*)*10); //Create an array of character pointers
//Place char * inside of char * array
my_string_array[0] = my_string;
return 0;
}