c - 我一直遇到段错误,我不确定为什么

标签 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;
}

最佳答案

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";

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

关于c - 我一直遇到段错误,我不确定为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54921955/

相关文章:

char** 分配以及如何存储值

c++ - 我在从文件读取的 getc () 中有一个段错误

c++ - 无法在 C++ 的赋值中将 ‘int*’ 转换为 ‘int**’

c - 如何在C中输入非常大的数字(超过200位)?

c - 运行代码 x 时间

c - gdb:程序退出,代码为 030000000375

c - 列表C中字符串的动态内存分配

multithreading - Valgrind 处理线程和机器级同步指令的效果如何?

c - 为什么这个 C 程序报告的吞吐量比 nload 高?

c - strcpy函数的实现