指向整数转换错误的指针不兼容

时间:2017-06-21 16:02:05

标签: c arrays malloc return-type

我正在尝试学习c,其中main函数调用一些其他函数返回一个数组(例如字符串类型)。

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

char* array_return(char* name);

int main(){
    char* name="orange";
    char* A;
    A=array_return(name);
    free(A);

    printf("%s\n","Check stored values in A");
    int k,n;
    n=10;
    for (k=0; k < n; k++) {
        printf("%s\n",A[k]);
    }

    return 0;
}


char* array_return(char* name){
    int k,n;
    n=10;
    char* A=malloc(n);
    char string[100];

    printf("%s\n","Store values in A");
    for (k=0; k < n; k++) {
        strcpy(string,"Numer of ");
        strcat(string,name);
        strcat(string," are: ");
        sprintf(string,"%s %i",string,k);
        A[k]=string;
        printf("%s\n",A[k]);
    }
    printf("%s\n","--------------------------");
    return A;
}

我正在尝试将以下值存储在数组“A”中:

Numer of orange are:  0
Numer of orange are:  1
Numer of orange are:  2
Numer of orange are:  3
Numer of orange are:  4
Numer of orange are:  5
Numer of orange are:  6
Numer of orange are:  7
Numer of orange are:  8
Numer of orange are:  9

但是,我收到了一些警告

warning: format specifies type 'char *' but the argument has type 
'char'

incompatible pointer to integer conversion assigning to 'char'
  from 'char [100]' [-Wint-conversion]

并且,当我运行程序时出现以下错误:

Segmentation fault: 11

如果有人可以帮我调试这段代码,我将非常感激。

1 个答案:

答案 0 :(得分:3)

所以代码的问题很多。与您的错误消息相关的一个原因是A[k]不是字符串,而您尝试将其打印为一个字符串。

printf("%s\n",A[k]);

A[k]k指向的内存的A元素,因为A被声明为char *,这意味着{{1}类型为A[k]。要执行您要执行的操作,您希望char实际上被声明为A

char **

但是您的代码在技术上仍然无法正常工作,因为将char **A=malloc(sizeof(*A)*n); // We need n lots of what A points to 分配给string只会将A[k]指向的string分别复制到A的每个元素中,所以它们都将是相同。也就是说,直到该函数完成,然后您进入未定义行为领域,因为string使用的内存不再有效。

所以你要做的是将string中的字符串复制到A[k]指向的新字符串中。最简单的方法是使用strdup,因为它将为您的字符串分配空间并在一次函数调用中复制它。

A[k]=strdup(string);

或者,你可以完全抛弃string并为A[k]分配内存并直接构建你想要的字符串。