将数组作为void指针发送时,使用puts在c中输出二维字符数组时出错

问题描述


#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
#define size 5


void *displayName(void *received_array){ 


char *name = received_array;


for(int i=0;i<5;i++)

     puts(name[i]);


 pthread_exit(0);

 }
 
int main(){
 pthread_t threadid1;

char name[10][50];
strcpy(name[2],"raj");
strcpy(name[3],"pol");
strcpy(name[4],"Sara");*/

pthread_create(&threadid1,NULL,displayName,name);

}


函数displayName’中: q2v2.c:42:15:警告:传递“puts”的参数 1 使指针从整数而不进行强制转换 [-Wint-conversion] 42 | puts(name[i]); | ~~~~^~~~ | | |字符

解决方法

您应该匹配传递的指针的类型。

替换

char *name = received_array;

char (*name)[50] = received_array;

另外不要忘记在 name[0] 函数中初始化 name[1]main()

,
<source>:9:15: warning: passing argument 1 of 'puts' makes pointer from integer without a cast [-Wint-conversion]
    9 |      puts(name[i]);
      |           ~~~~^~~
      |               |
      |               char

此警告意味着 puts 需要一个指针,但您给了它一个整数类型,例如 char 而不是 char*

如果看完文字还是不明白警告,编译器好心用“ASCII art”指出错误的确切位置:

    9 |      puts(name[i]);
      |           ~~~~^~~
      |               |
      |               BUG HERE this is a char

当编译器指出错误的确切位置时,建议怀疑编译器是正确的,这确实是错误的确切位置。

话虽如此,您将 char(*)[50] 传递给 pthread,然后在线程回调中将其用作 char*,这是第二个错误。