使用char **

时间:2018-02-13 17:44:34

标签: c gcc

我从中获得了比较部分的代码片段。我正在研究如何在我的程序中实现比较功能。

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

 int compare(const void* a,const void* b)
 {
  char** sa=(char**)a;
  char** sb=(char**)b;
  return strcmp(*sa,*sb);
 }

int main(){

int l=compare("helloworld","hello");
printf("%d",l);

return 0;

}

但我得到了分段错误。我是c中指针的新手。我应该做什么修改,以便从这个程序中得到l的值。

2 个答案:

答案 0 :(得分:1)

除了调用库函数compare之外,您在strcmp方法中没有做任何有用的事情。只需将其替换为以下内容:

 int compare(const char* a,const char* b)
 {
    return strcmp(a,b);
 }

但是,如果您仍想将char *指向来回转换为void *,可以通过以下方式进行:

int compare(const void* a,const void* b)
 {
  char** sa=(char**)&a;
  char** sb=(char**)&b;
  return strcmp(*sa,*sb);
 }

答案 1 :(得分:0)

您将字符串“hello”取消引用为地址,这些地址无效。 sa和sb指向指向字符的指针,但a和b只是指针(恰好是指向字符的指针。)你可以使用:

char** sa=(char**)&a;
char** sb=(char**)&b;

这意味着将sa和sb设置为指针a和b的地址(恰好是指向字符的指针,以及指向字符指针的指针)或:

int compare(const void** a,const void** b)

char** sa=(char**)a;
char** sb=(char**)b;

...

int l=compare(&"helloworld",&"hello");

表示将指针的地址传递给“hello”的第一个字节(指向指针的指针)

或大多数人会这样做的方式:

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

 int compare(const void* a,const void* b)
 {
  char* sa=(char *)a;
  char* sb=(char *)b;
  return strcmp(sa,sb);
 }

int main(){

int l=compare("helloworld","hello");
printf("%d",l);

return 0;

}

除非有一些理由说明为什么你需要sa和某人指向指向字符的指针,当然。