为什么我的函数在从库中调用时会导致段错误?

时间:2012-11-22 18:30:21

标签: c

此代码将矢量(argv)转换为字符串,然后打印它。但是,如果从库(my_vect2str)调用vect2str,它会发出警告:

warning: passing argument 1 of ‘puts’ makes pointer from integer without a cast

跑步时的段错误。这里的函数vect2str与库中的函数(my_vect2str)完全相同。该库是在同一台计算机上编译的。

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

#include "../lib/my.h"

char *vect2str(char **str) {

if (str == NULL)
    return NULL;
if (*str == NULL)
    return NULL;

int num = 0;
char * a;

int i;
for(i = 0; str[i] != '\0'; )
    num += strlen(str[i++]);

num += i;
a = (char *) xmalloc(num * sizeof(char));

//Make new string
char space = ' ';
char *end = "";

int j;
for(j = 0; str[j] != NULL; j++) {
    strcat(a, str[j]);
    strcat(a, &space);
    }
strcat(a, end);
return a;
}

int main(int argc, char **argv) {

puts(vect2str(argv));

//This does not work
//puts(my_vect2str(argv));
}

2 个答案:

答案 0 :(得分:2)

它在cygwin上编译得很好,而puts收到一个字符指针就好了 我看到的问题是你正在使用指向单个字符的指针strcat

strcat(a, &space);

strcat的工作方式是从一个字符串复制到另一个字符串,直到找到一个终止空字符('\ 0'),如果你不提供一个字符串,可能会发生奇怪的事情,改变为此:

strcat(a, " ");

答案 1 :(得分:0)

1)首先

for(i = 0; str[i] != '\0'; )

这是错误的,因为str [i]是一个地址而不是char,所以你必须比较一个NULL地址而不是一个空字符。在这之后怎么做

for(i = 0; str[i] != NULL; )

2)第二 将空间定义如下

char space = " ";

然后

 strcat(a, space);

而不是

strcat(a, &space);

3)我不知道xmalloc()是否将分配的内存设置为0.如果不是,则必须将a数组中的第一个元素设置为'\0'

a = (char *) xmalloc(num * sizeof(char));
a[0] = '\0';