使用strcpy进行分段错误

时间:2015-01-01 15:58:46

标签: c segmentation-fault strcpy

当使用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;
}

4 个答案:

答案 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];

也在代码中修复。