5

このコードは、vector(argv)を文字列に変換し、それを出力します。ただし、vect2strがライブラリ(my_vect2str)から呼び出されると、警告が表示されます。

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

そして、実行されたときにsegfaults。ここでの関数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));
}
4

2 に答える 2

2

cygwinで正常にコンパイルされputs、charポインタを正常に受け取ります。
私が見た問題はstrcat、単一の文字へのポインタを使用してを実行していることです。

strcat(a, &space);

動作する方法strcatは、終了するヌル文字('\ 0')が見つかるまで、ある文字列から別の文字列にコピーすることです。文字列に1つを指定しないと、奇妙なことが起こる可能性があります。次のように変更してください。

strcat(a, " ");
于 2012-11-22T18:39:11.057 に答える
0

1)まず第一に

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

str [i]はcharではなくアドレスであるため、これは間違っています。したがって、null文字ではなくNULLアドレスと比較する必要があります。ここでそれを行う方法の後

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

2)2番目次のようにスペースを定義します

char space = " ";

その後

 strcat(a, space);

ではなく

strcat(a, &space);

xmalloc()3)割り当てられたメモリを0に設定しているかどうかはわかりません。そうでない場合は、a配列の最初の要素をに設定する必要があります'\0'

a = (char *) xmalloc(num * sizeof(char));
a[0] = '\0';
于 2012-11-22T18:36:35.477 に答える