c - 使用指针的段错误(核心转储)

标签 c string pointers segmentation-fault

当我构建下面的代码时,我得到输出

Mystr
segmentation fault (core dumped)

我猜 strNULL 和 set 函数导致错误.. 我猜是赖特吗???

我不确定出了什么问题。 请告诉我出了什么问题以及如何解决它。
如果能建议我的编码风格,我将不胜感激:D

globalcall.c(声明全局指针)

void *call = 0;

string1.h(头文件)

typedef struct tag_string{
    char *str;
    unsigned int len;

    int (*compare)(struct tag_string *target);
    struct tag_string *(*set)(struct tag_string *target);
} string;

string *new_String(const char *str);
void delete_string(string *str);



字符串.c

#include <stdlib.h>
#include "string1.h"

extern string *call;

int _string_compare(string *target);
string *_string_set(string *target);

string *new_string(const char *str){
    string *ptr;
    int i = 0;

    ptr = (string *)malloc(sizeof(string));
    if(ptr == 0){
        return 0;
    }

    ptr->str = 0;
    ptr->len = 0;

    ptr->compare = _string_compare;
    ptr->set = _string_set;

    if(str){
        for(ptr->len = 0;str[ptr->len];ptr->len++);

        ptr->str = (char *)malloc(ptr->len + 1);

        if(ptr->str == 0){
            free(ptr);
            return 0;
        }
        for(i = 0;i<ptr->len + 1;i++){
            ptr->str[i] = str[i];
        }
    } else {
        ptr->str = (char *)malloc(1);
        ptr->str = 0;
    }

    return ptr;
}

void delete_string(string *str){
    if(str->str != 0){
        free(str->str);
        str->str = 0;
    }
    free(str);

    return;
}

int _string_compare(string *target){
    int i = 0;
    if(call->len != target->len){
        return 0;
    } else {
        for(i=0;i<call->len;i++){
            if(call->str[i] != target->str[i]){
                return 0;
            }
        }
    }
    return 1;
}

string *_string_set(string *target){
    int i = 0;

    free(call->str);
    call->str = (char *)malloc(call->len+1);

    for(i = 0;i<call->len;i++){
        call->str[i] = target->str[i];
    }

    call->len = target->len;

    return call;
}



主文件

#include <stdio.h>
#include "string1.h"

extern void *call;

int main(void) {
    string *mystr = new_string("Mystr");
    string *strNULL = new_string(0);

    printf("%s\n",mystr->str);
    printf("%s\n",strNULL->str);

    if(strNULL->set(mystr)->compare(mystr)){
        printf("Compare : TRUE!");
    }

    printf("%s\n",mystr->str);
    printf("%s\n",strNULL->str);

    delete_string(mystr);
    delete_string(strNULL);

    return 0;
}

最佳答案

据我所知,您从不call 变量赋值。

并且该变量被初始化为空指针,因此 call->anything 的任何引用都会触发未定义的行为。

关于c - 使用指针的段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409084/

相关文章:

c fscanf 使用和换行

带有函数指针的 C 通用 ADT

c++ - 加速 FFTW 修剪以避免大量零填充

java - 当您需要创建一个指向变量的指针时,为什么指针可以节省内存?

c - 数组性能与 LinkedList 非常相似 - 给出了什么?

java - 如何从 JVM 内存中清除明确的敏感数据?

c++ - 一次输入一行到c++中的字符串数组

从字符串中获取星期几的 Javascript 方法?

C++ 地址和指针

c - 在 C 中推进数组指针