当使用strcpy复制带有已分配内存的双指针内的字符串数组时,我遇到了一些麻烦,但我无法理解为什么即使我以前分配了内存也会出现分段错误。 这是代码:
#include <stdio.h>
#include <string.h>
typedef struct Students {
int q_exams;
char **done_exams;
}Students;
int main() {
Students a;
int i;
char support[30];
printf("how many exams have you done ?\n");
scanf("%d",&(a.q_exams));
a.done_exams=malloc(sizeof(char*)*a.q_exams);
if(a.done_exams==NULL)
{
printf("out of memory\n");
return 0;
}
for(i=0;i<a.q_exams;i++)
{
printf("Insert the name of the exam\n");
scanf("%28s",support);
a.done_exams[i]=malloc(strlen(support)+1);
if(a.done_exams[i]==NULL)
{
printf("out of memory\n");
return 0;
}
strcpy(a.done_exams[i][0],support);
fflush(stdin);
}
return 0;
}
答案 0 :(得分:1)
您需要将初始字符的地址传递给strcpy
,或者像这样
strcpy(&a.done_exams[i][0],support);
// ^
// Add an ampersand
或者相当于这样:
strcpy(a.done_exams[i] , support);
// ^
// Remove the second index
目前,您的代码会传递初始字符的值 * ,而不是其地址。
* 这个值当时也是未定义的,但它不是主要原因,因为你根本不应该传递值。
答案 1 :(得分:0)
在
strcpy(a.done_exams[i][0],support);
应该是
strcpy(a.done_exams[i],support);
或
strcpy(&a.done_exams[i][0],support);
我的建议是始终在打开编译器警告的情况下进行编译。我的编译器(gcc
)非常好地解决了问题,并告诉你确切需要做些什么来解决它:
test.c:37:12: warning: incompatible integer to pointer conversion passing 'char' to
parameter of type 'char *'; take the address with & [-Wint-conversion]
strcpy(a.done_exams[i][0],support);
^~~~~~~~~~~~~~~~~~
&
P.S。你也遗漏了一些#include
:
#include <stdlib.h>
#include <string.h>
答案 2 :(得分:0)
请参阅strcpy()
的手册页。
第一个参数应为char *
类型。
根据您的代码,参数[a.done_exams[i][0]
]的类型为char
。您需要实际传递char *
[目的地的起始地址]。
将您的代码更改为
strcpy(a.done_exams[i],support);
答案 3 :(得分:0)
此代码已修复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Students {
int q_exams;
char **done_exams;
} Students;
int main()
{
Students a;
int i;
char support[49];
printf("how many exams have you done ?\n");
scanf("%d",&(a.q_exams));
a.done_exams = malloc(sizeof(char*) * a.q_exams);
if(a.done_exams==NULL)
{
printf("out of memory\n");
return 0;
}
for(i = 0 ; i < a.q_exams ; i++)
{
printf("Insert the name of the exam\n");
scanf("%48s",support);
a.done_exams[i] = malloc(strlen(support)+1);
if(a.done_exams[i] == NULL)
{
printf("out of memory\n");
return 0;
}
strcpy(a.done_exams[i]/*[0]*/, support);
/* ^ ^- this is wrong
* + pass the address to the array not the first element value
*
* if you had warnings turned on you would have seen this
*/
fflush(stdin);
}
return 0;
}
注意
scanf("%48s", support);
需要
char support[49];
也在代码中修复。