【发布时间】:2016-06-02 13:22:58
【问题描述】:
我正在尝试在一个 char * 字符串中交换字符。我希望交换函数接受一个 void *[] 是通用的,但我得到了一个奇怪的行为,我不知道为什么。
我的主要:
int main(int argc, char *argv[])
{
size_t n_bytes = 100;
int bytes;
char *my_input;
int numeric = 0;
my_input = (char *) malloc(n_bytes + 1);
/* if -n option is set, sort numerically versus lexicographically. */
if (argc > 1 && strcmp(argv[1], "-n") == 0) numeric = 1;
while(getline(&my_input, &n_bytes, stdin) && strlen(my_input) > 1)
{
swap((void **) my_input, 0, 2);
}
free(my_input);
return 0;
}
使用 printf-ing 交换功能以进行“调试”:
void swap(void *v[], int i, int j)
{
void *temp;
printf("i: %d j: %d\n", i, j);
for(int x = 0; x < strlen(v); x++)
{
printf("%c\n", v[x]);
}
temp = v[i];
v[i] = v[j];
v[j] = temp;
printf("first letter: %c", v[j]);
}
打印循环中出现的是用户输入的字符串的第一个字符(例如,如果 input == "hello",打印的第一个字符将是 'h')。打印的其余部分始终是垃圾,而不是其余字符。打印 v[j] 中保存的内容的 printf 打印出交换后的值,无论第一个字符是什么。我猜我错过了一个明显的概念,但似乎无法弄清楚。
【问题讨论】:
-
1.将类型不正确的数据传递给
printf会导致未定义的行为。%c接受int,而不是void*。 2.在循环条件下使用strlen()可能会导致性能不佳。 -
不同类型使用不同数量的内存。除非我遗漏了一些东西,否则你如何期望交换函数知道如何交换未知大小的东西——只使用
void *? -
void *是通用指针,但void **不是。 -
编译时出现警告。
标签: c pointers void-pointers