我在将指针应用于指针概念时使用冒泡排序按字母顺序对数组进行排序。当我使用strcpy函数交换数组* b [4]的地址时,我的程序崩溃,使用指针指向** p [4],除了程序工作正常。
INSERT INTO user VALUES (1, 'example@email.com');
答案 0 :(得分:2)
程序崩溃的原因是您尝试将C字符串的内容复制到未初始化的指针temp
中,从而导致未定义的行为。
即使您通过为temp
提供适当长度的缓冲区来解决此问题,在将较长的字符串复制到为较短字符串分配的空间时(例如,将"cheese"
复制到空间时),您将获得未定义的行为已分配给"eggs"
)。此外,您当前的实现当前也有未定义的行为,因为它无法分配足够的空间来容纳字符串的null终结符。
解决这个问题的正确方法是交换指针,而不是使用它们来复制内容。
答案 1 :(得分:0)
在strcpy(temp,*p[i])
中,temp
应指向应将字符串复制到的内存。您从未初始化temp
,从而导致未定义的行为。
但正如您所提到的,您只需复制指针即可。
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp;
清理解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *a[] = { "milk", "eggs", "bread", "cheese" };
size_t n = sizeof(a)/sizeof(a[0]);
const char** p;
{ /* Make p a shallow copy of a so that we don't change a */
p = malloc(n * sizeof(char*));
{
size_t i;
const char** src = a;
const char** dst = p;
for (i=n; i--; )
*(dst++) = *(src++);
}
}
{ /* Sort p using bubble sort */
size_t i;
int swapped = 1;
while (swapped) {
swapped = 0;
for (i=0; i<n-1; ++i) {
if (strcmp(p[i], p[i+1]) > 0) {
const char* temp = p[i];
p[i] = p[i+1];
p[i+1] = temp;
swapped = 1;
}
}
}
}
{
size_t i;
for (i=0; i<n; ++i)
puts(p[i]);
}
free(p);
return 0;
}
答案 2 :(得分:0)
问题出在这里
for(i=0; i<3-j; i++)
j将迭代直到小于4,这意味着我将迭代直到它小于-1?
我从0开始,然后加1。
数组索引永远不能等于-1(因为它从0开始)。
另外,将上面一行更改为此
for(i=0; i<(j); i++)
代码很好。
答案 3 :(得分:0)
我不确定你分配和复制的愿望是否仅仅是为了简单的练习,但是在解决问题的过程中你会过度复杂化应该是一个简单的指针交换来排序a
。例如,为什么将a
声明为 2D char 数组而不是指向char 的指针数组(例如char *a[] = {....}
)?
通过将a
声明为指针数组,您只需要在排序中交换指针 - 无需分配或复制,例如。
#include<stdio.h>
#include<string.h>
int main (void) {
char *a[] = {"milk","eggs","bread","cheese"};
size_t n = sizeof a / sizeof *a, i, j;
for(j = 0; j < n; j++)
for(i = 0; i < n - 1 - j; i++)
if(strcmp(a[i], a[i+1]) > 0) {
char *tmp = a[i];
a[i] = a[i+1];
a[i+1] = tmp;
}
for (i = 0; i < n; i++)
printf ("a[%zu] : %s\n", i, a[i]);
return 0;
}
编译VS(cl.exe)
>cl /nologo /Wall /wd4710 /Ox /Foobj/bsarrayptr /Febin/bsarrayptr /Tc bsarrayptrs.c
编译gcc
$ gcc -Wall -Wextra -pedantic -std=gnu11 -Ofast -o bin/bsarrayptr bsarrayptrs.c
示例使用/输出
C:\Users\david\Documents\dev\src-c\tmp>bin\bsarrayptr.exe
a[0] : bread
a[1] : cheese
a[2] : eggs
a[3] : milk
如果您的意图只是使用额外级别的间接,复制和分配来执行练习,那很好,但如果您打算处理按字母顺序排列的a
,那么简单地交换指针就更多了有效的方法。
仔细看看,如果您有其他问题,请告诉我。