C语言数组赋值问题

weixin_37847078 2018-01-17 12:57:45

我的问题
在queue[capacity] = data;之后
queue数组中的所有元素都变成了data的值

运行环境

## macbook pro
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

## docker ubuntu container
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


我的源码

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <string.h>

#define times 10
#define length 100
#define name "wayne"

char* queue[length];
int capacity = 0;
int position = 0;
char tmp[sizeof(name)+10];

void push_data( char* data ) {
queue[capacity] = data;

printf("=========================\n\n");

printf("capacity is: %d; text is: %s\n", capacity, data);

for (int i=0; i<=capacity; i++) {
printf("index is: %d; element is: %s\n", i, queue[i]);
}

printf("\n=========================\n");

capacity++;
}

int main() {
for ( int i=0; i<times; i++) {
snprintf( tmp, sizeof(name)+2, "%s%d", name, i );
push_data( tmp );
}
}


运行结果

=========================

capacity is: 0; text is: wayne0
index is: 0; element is: wayne0

=========================
=========================

capacity is: 1; text is: wayne1
index is: 0; element is: wayne1
index is: 1; element is: wayne1

=========================
=========================

capacity is: 2; text is: wayne2
index is: 0; element is: wayne2
index is: 1; element is: wayne2
index is: 2; element is: wayne2

=========================
=========================

capacity is: 3; text is: wayne3
index is: 0; element is: wayne3
index is: 1; element is: wayne3
index is: 2; element is: wayne3
index is: 3; element is: wayne3

=========================
=========================

capacity is: 4; text is: wayne4
index is: 0; element is: wayne4
index is: 1; element is: wayne4
index is: 2; element is: wayne4
index is: 3; element is: wayne4
index is: 4; element is: wayne4

=========================
=========================

capacity is: 5; text is: wayne5
index is: 0; element is: wayne5
index is: 1; element is: wayne5
index is: 2; element is: wayne5
index is: 3; element is: wayne5
index is: 4; element is: wayne5
index is: 5; element is: wayne5

=========================
=========================

capacity is: 6; text is: wayne6
index is: 0; element is: wayne6
index is: 1; element is: wayne6
index is: 2; element is: wayne6
index is: 3; element is: wayne6
index is: 4; element is: wayne6
index is: 5; element is: wayne6
index is: 6; element is: wayne6

=========================
=========================

capacity is: 7; text is: wayne7
index is: 0; element is: wayne7
index is: 1; element is: wayne7
index is: 2; element is: wayne7
index is: 3; element is: wayne7
index is: 4; element is: wayne7
index is: 5; element is: wayne7
index is: 6; element is: wayne7
index is: 7; element is: wayne7

=========================
=========================

capacity is: 8; text is: wayne8
index is: 0; element is: wayne8
index is: 1; element is: wayne8
index is: 2; element is: wayne8
index is: 3; element is: wayne8
index is: 4; element is: wayne8
index is: 5; element is: wayne8
index is: 6; element is: wayne8
index is: 7; element is: wayne8
index is: 8; element is: wayne8

=========================
=========================

capacity is: 9; text is: wayne9
index is: 0; element is: wayne9
index is: 1; element is: wayne9
index is: 2; element is: wayne9
index is: 3; element is: wayne9
index is: 4; element is: wayne9
index is: 5; element is: wayne9
index is: 6; element is: wayne9
index is: 7; element is: wayne9
index is: 8; element is: wayne9
index is: 9; element is: wayne9

=========================

...全文
229 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-01-17
  • 打赏
  • 举报
回复
引用 4 楼 weixin_37847078 的回复:
push_data函数改成了这样,结果正确

//queue[capacity] = data;
queue[capacity] = malloc( strlen( data ) + 1 );
strcpy( queue[capacity], data );
这样是可以的。 建议再判断一下malloc的返回值
weixin_37847078 2018-01-17
  • 打赏
  • 举报
回复
push_data函数改成了这样,结果正确

//queue[capacity] = data;
queue[capacity] = malloc( strlen( data ) + 1 );
strcpy( queue[capacity], data );
weixin_37847078 2018-01-17
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
queue是不存放数据的,而是存储tmp的地址,这个是需要理解和注意的
了解了,不过我怎么在每次循环时都开辟新的空间呢?能不能帮我写个demo,多谢!
自信男孩 2018-01-17
  • 打赏
  • 举报
回复
这是正常的,因为queue是指针数组,并且每个指针都是指向data,即tmp字符数组的。每次调用push_data都会修改tmp的内容,所以每个指针都指向tmp,得到的都是最新的tmp修改之后的字符串;
自信男孩 2018-01-17
  • 打赏
  • 举报
回复
queue是不存放数据的,而是存储tmp的地址,这个是需要理解和注意的

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧