我正在尝试读取10行不同长度的文件(不超过349个字符),并将它们存储在动态分配的数组中,以便以后能够操作它们。我有下面的代码,它给了我一个“警告:传递参数1的âstrcpyâ使得指针来自整数而没有强制转换”的消息。
我在这里做错了什么?我的逻辑是地址应该是一个指针数组的指针,其中数组中的每个指针都指向字符串中的一行,我试图通过使用该行的strcpy来实现这一点。
char buffer[350];
char** addresses;
int i = 0;
*addresses = malloc(sizeof(char*)*10); /* Let's start off with 10 addresses */
while(fgets(buffer, sizeof(buffer), stdin) != NULL)
{
strcpy(*addresses[i],buffer);
i++;
}
答案 0 :(得分:2)
你有几个问题:
语法:
使用
strcpy(addresses[i],buffer);
而不是
strcpy(*addresses[i],buffer);
内存:
您需要为addresses[i]
分配内存,然后才能将buffer
的内容复制到其中。
在调用addresses[i]
之前添加一行以为strcpy
分配内存。
addresses[i] = malloc(sizeof(buffer));
答案 1 :(得分:1)
你必须这样付出,
strcpy(addresses[i],buffer);
如果你这样做,
strcpy(*addresses[i],buffer);
第一个参数将被视为单个字符。
在分配内存的同时,你可以这样做,
address=malloc(sizeof(char)*10);
您必须为每个指针分配内存。
address[i]=malloc(strlen(buffer)+1);
否则,您可以使用strdup
函数来为给定的内存分配内存
字符串长度。
address[i]=strdup(buffer);
strdup()函数返回一个指向新字符串的指针,该字符串是字符串s的副本。记忆 对于新字符串是使用malloc(3)获得的,可以使用free(3)释放。
答案 2 :(得分:1)
addresses
是指向指针的指针,因此您需要先为指针分配内存,然后再单独为每个指针分配内存,如下所示。
在2D空间中,如果addresses
是指向指针的指针,则addresses[i]
是指针。在写入此位置之前为其分配内存。
char** addresses;
addresses = malloc(sizeof(char*)*10);// Now you 10 character pointers
int i = 0;
while(fgets(buffer, sizeof(buffer), stdin) != NULL)
{
size_t n = strlen(buffer);
if(n>0 && buffer[n-1] == '\n')
buffer[n-1] = '\0';
if(i>=10)
break;
addresses[i] = malloc(strlen(buffer)+1);//Allocate memory to the pointer before writing to it
strcpy(addresses[i],buffer);
i++;
}
PS:fgets()
附带一个换行符,所以我添加了一个检查来替换换行符。
答案 3 :(得分:1)
快速解决我在此处看到的错误:
addresses
(例如*addresses
或addresses[0]
),而不确保addresses
点在某处有效。在取消引用之前,您需要分配到addresses
。*addresses[i]
中strcpy(*addresses[i],buffer)
的类型为char
,预计char *
为strcpy(addresses[i], buffer)
。这是你的编译器抱怨的。我怀疑你的意思是malloc
。即使您要在嵌入式环境中运行此代码,您的要求也很简单,您不需要malloc
。事实上,引入#define nelem(array) (sizeof array / sizeof *array) /* number of elements in array */
int main(void)
{
char address[10][351] = { 0 };
size_t size = 0;
while (size < nelem(address) && fgets(address + size, sizeof *address, stdin))
{
address[size][strcspn(address[size], "\n")] = '\0';
size++;
}
}
使事情变得复杂......除非绝对必要,否则我会避免使用它。而是使用自动存储持续时间。它会让生活更轻松,因为你不会有太多的错误情况需要处理(尽管你还没有处理它们)...
10
请注意,351
和{{1}}只会在此处显示一次...您可以在合理的范围内随意调整它们。如果您可以将它们乘以兆字节区域,您可能需要考虑不同的数据结构,具体取决于您打算如何处理。