我不断遇到细分错误,我不确定为什么

时间:2019-02-28 09:09:21

标签: c segmentation-fault dynamic-memory-allocation calloc

我很确定这与我对calloc()的使用有关,但我不明白为什么。该程序的目标是让char* C包含char* A中不在的char* B字符。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

char* diff(char* A, char*B);

int main() {
  char* A = {'q','g','e','\0'};
  char* B = {'a','d','e','\0'};
  char* C = diff(A,B);
  printf("%s", C);
  free(C);
  return(0);
}

int search(char* S, char c) {
    int i=0;

    while( S[i]!='\0' ){
        if( S[i]==c ) break;
        i++;
    }
    if( S[i]=='\0' ) return -1;
    else return i;
}

char* diff(char* A, char* B) {
    int i;
    char* C = calloc(strlen(A), sizeof(char));
    assert(C != NULL);
    int lengthC = 0;

    for (i = 0; i < strlen(A); i++) {
        if (-1 != -1) {
            C[lengthC] = A[i];
            lengthC++;
        }
    }

    C[lengthC] = '\0';
    return C;
}

2 个答案:

答案 0 :(得分:3)

char*指针的初始化可能看起来像这样:

char *A = { (char*)(void*)(uintptr_t)5 };

这会将字面值5分配为A指针的值。 A指针将(可能)指向无效的内存位置。

转换(char*)(void*)(uintptr_t)(或稍微相似的转换)可以由编译器隐式完成。编译器最好发出至少有关从整数到指针的隐式转换的警告。

您还可以“超出” { }括号内的元素数量。即:

char* A = { 1, 2, 3, 4, 5, };

数字2, 3, 4, 5,被忽略,因为char*只能从一个值初始化。

例如,编译器应就这些警告您。在gcc中,我得到了:

<source>:6:16: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
    char* A = {'q','g','e','\0'};
               ^~~
<source>:6:20: warning: excess elements in scalar initializer
    char* A = {'q','g','e','\0'};

所以:

char* A = {'q','g','e','\0'};

等于:

char *A = 113;

根据ascii tableq等于113。

113是无效的指针。稍后在您的代码中执行以下操作:

strlen(A)

尝试访问A指针后面的内存。由于指针无效,因此未定义会发生什么。在您的系统上,您会遇到细分错误。

A变量可能应该更改为数组:

char A[] = {'q','g','e','\0'};

或等效:

char A[] = "qge";

这将创建一个字符数组,并使用适当的值对其进行初始化。

答案 1 :(得分:-1)

您不能以这种方式初始化指针。 char * A = {'q','g','e','\ 0'}; 它似乎可以在某些编译器上进行编译,用这种方式初始化是错误的。 请记住,指针变量就像整数数据类型。实际上,它拥有一个包含存储位置地址的整数值。

它应该改为数组: 字符A = {'q','g','e','\ 0'}; 数组名称本身在C中充当指针(当然有一些限制),因此您将数组名称本身作为参数传递给函数。

第二个考虑您的程序目标:char * C包含char * A不在char * B中的字符,

if(-1!= -1)语句似乎是一个错字,我想你的意思是

如果(search(B,A [i])== -1)

在calloc调用中可能还需要进行类型转换,因为它返回void *

char * C =(char *)calloc(strlen(A),sizeof(char));

考虑所有这些事情,下面的程序可以实现您的目标:

希望这会有所帮助:)

int main() {
    char A[] = { 'q','g','e','\0' };
    char B[] = { 'a','d','e','\0' };
    char* C = diff(A, B);
    printf("%s", C);
    free(C);
    return(0);
    }

int search(char* S, char c) {
    int i = 0;

    while (S[i] != '\0') {
        if (S[i] == c) break;
        i++;
        }
    if (S[i] == '\0') return -1;
    else return i;
}

char* diff(char* A, char* B) {
    int i;
    char* C = (char *) calloc(strlen(A), sizeof(char));
    assert(C != NULL);

    int lengthC = 0;

    for (i = 0; i < strlen(A); i++) {
        if (search(B,A[i]) == -1) {
            C[lengthC] = A[i];
            lengthC++;
        }
    }

    C[lengthC] = '\0';
    return C;
}