免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4898 | 回复: 5
打印 上一主题 下一主题

[C] void *指针赋值问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-30 22:50 |只看该作者 |倒序浏览
本帖最后由 jiean 于 2012-10-31 23:03 编辑
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdint.h>
  4. #include<stdlib.h>

  5. #define u_char unsigned char

  6. typedef struct {
  7.     size_t len;
  8.     u_char *data;
  9. }my_str_t;

  10. typedef struct my_array_s {
  11.     void        *elts;
  12.     uintptr_t   nelts;
  13.     size_t       size;
  14.     uintptr_t   nalloc;
  15. }my_array_t;

  16. int main(){
  17.     char c='|';
  18.     uintptr_t i;
  19.     u_char *p;
  20.     void *vptr;
  21.     my_str_t *my_str;
  22.     my_array_t *my_array;
  23.     my_array=(my_array_t *)malloc(sizeof(my_array_t));
  24.     my_array->elts=calloc(10,sizeof(my_str_t));
  25.     my_array->nelts=0;
  26.     my_array->size=sizeof(my_str_t);
  27.     my_array->nalloc=10;
  28.    


  29.     my_str_t str={strlen("|/usr/localmabc%h%m"),"|/usr/localmabc%h%m"};
  30.     p=str.data;

  31.     vptr=my_array->elts;
  32. /*    for(i=0;i<10;i++){
  33.    
  34.         my_str=vptr;
  35.         my_str->len=str.len;
  36.         my_str->data=str.data;
  37.         vptr=(u_char *)my_array->elts+i*sizeof(my_str_t);
  38.     }
  39. */   用这个方法赋值是没有问题的      
  40.     my_str=my_array->elts;   
  41.     for(i=0;i<10;i++){
  42.         my_str=(u_char *)my_array->elts+i*sizeof(my_str_t);
  43.         my_str->len=str.len;
  44.         my_str->data=str.data;
  45.     } //用以上方法会报段错误,请教一下问题出在哪?

  46. //vptr=my_array->elts;
  47.     for(i=0;i<10;i++){
  48.         vptr=(u_char *)my_array->elts+i*sizeof(my_str_t);
  49.         printf("%d\n",((my_str_t *)vptr)->len);
  50.         printf("%s\n",((my_str_t *)vptr)->data);

  51.     }
  52.     return 0;
  53. }
复制代码
关于void *指针问题赋值问题

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-31 12:27 |只看该作者
  1.     for(i=0;i<10;i++){
  2.          
  3.         my_str->len=str.len;
  4.         my_str->data=str.data;
  5.         my_str=(u_char *)my_array->elts+i*sizeof(my_str_t);
  6.     } //用以上方法会报段错误,请教一下问题出在哪?
复制代码
这里有逻辑错误, 其实是0赋值2次, 1赋值2次, 2赋值2次, .... 8赋值两次, 9根本没复制, 导致下面循环打印到9的时候出core, 我没试, 不过差不多就这个原因吧.

论坛徽章:
0
3 [报告]
发表于 2012-10-31 12:37 |只看该作者
本帖最后由 FaintKnowledge 于 2012-10-31 12:40 编辑
jiean 发表于 2012-10-30 22:50
关于void *指针问题赋值问题




my_str_t *my_str; ,这个不是结构体的指针吗?NULL和0可以给它复制void也可以? 加个类型看看呢

my_str=my_array->elts;   //这里 ?
    for(i=0;i<10;i++){
         
        my_str->len=str.len;
        my_str->data=str.data;
        my_str=(u_char *)my_array->elts+i*sizeof(my_str_t); //这里?


具体报的什么错啊?

论坛徽章:
0
4 [报告]
发表于 2012-10-31 21:53 |只看该作者
回复 2# linux_c_py_php


嗯,这个已更正

   

论坛徽章:
0
5 [报告]
发表于 2012-10-31 21:58 |只看该作者
FaintKnowledge 发表于 2012-10-31 12:37
my_str_t *my_str; ,这个不是结构体的指针吗?NULL和0可以给它复制void也可以? 加个类型看看呢

  ...



     for(i=0;i<10;i++){
         my_str=(my_str_t *)((u_char *)my_array->elts+i*sizeof(my_str_t));
         my_str->len=str.len;
         my_str->data=str.data;
     }

已强制类型转换,但是还是报错,只能打印前4个,第5个赋值有问题直接报段错误:

19
|/usr/localmabc%h%m
19
|/usr/localmabc%h%m
19
|/usr/localmabc%h%m
19
|/usr/localmabc%h%m
0
段错误

论坛徽章:
0
6 [报告]
发表于 2012-11-01 09:04 |只看该作者
本帖最后由 FaintKnowledge 于 2012-11-01 09:06 编辑

回复 5# jiean


我这里是正常的?
  1. [root@sp ~]# cat test.c
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>

  6. #define u_char unsigned char

  7. typedef struct {
  8.     size_t len;
  9.     u_char *data;
  10. }my_str_t;

  11. typedef struct my_array_s {
  12.     void        *elts;
  13.     uintptr_t   nelts;
  14.     size_t       size;
  15.     uintptr_t   nalloc;
  16. }my_array_t;

  17. int main(){
  18.     char c='|';
  19.     uintptr_t i;
  20.     u_char *p;
  21.     void *vptr;
  22.     my_str_t *my_str;
  23.     my_array_t *my_array;
  24.     my_array=(my_array_t *)malloc(sizeof(my_array_t));
  25.     my_array->elts=calloc(10,sizeof(my_str_t));
  26.     my_array->nelts=0;
  27.     my_array->size=sizeof(my_str_t);
  28.     my_array->nalloc=10;
  29.    


  30.     my_str_t str={strlen("|/usr/localmabc%h%m"),"|/usr/localmabc%h%m"};
  31.     p=str.data;

  32.     vptr=my_array->elts;
  33. /*    for(i=0;i<10;i++){
  34.    
  35.         my_str=vptr;
  36.         my_str->len=str.len;
  37.         my_str->data=str.data;
  38.         vptr=(u_char *)my_array->elts+i*sizeof(my_str_t);
  39.     }
  40. */
  41.     my_str=my_array->elts;   
  42.     for(i=0;i<10;i++){
  43.         my_str=(my_str_t *)((u_char *)my_array->elts+i*sizeof(my_str_t));
  44.         my_str->len=str.len;
  45.         my_str->data=str.data;
  46.     } //用以上方法会报段错误,请教一下问题出在哪?

  47. //vptr=my_array->elts;
  48.     for(i=0;i<10;i++){
  49.         vptr=(u_char *)my_array->elts+i*sizeof(my_str_t);
  50.         printf("%d\n",((my_str_t *)vptr)->len);
  51.         printf("%s\n",((my_str_t *)vptr)->data);

  52.     }
  53.     return 0;
  54. }
  55. [root@sp ~]#
复制代码
  1. [root@sp ~]# ./a.out
  2. 19
  3. |/usr/localmabc%h%m
  4. 19
  5. |/usr/localmabc%h%m
  6. 19
  7. |/usr/localmabc%h%m
  8. 19
  9. |/usr/localmabc%h%m
  10. 19
  11. |/usr/localmabc%h%m
  12. 19
  13. |/usr/localmabc%h%m
  14. 19
  15. |/usr/localmabc%h%m
  16. 19
  17. |/usr/localmabc%h%m
  18. 19
  19. |/usr/localmabc%h%m
  20. 19
  21. |/usr/localmabc%h%m
  22. [root@sp ~]# echo $?
  23. 0
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP