注册 登录
编程论坛 C语言论坛

这段代码为何无法运行?

hffjhhh 发布于 2020-05-11 14:17, 1245 次点击
指针数组p所指向字符的值一个一个拷贝给指针q.
以下代码对指针数组q也进行了初始化,这样子q算不算指向目标?
但却无法运行,是什么原因?代码如下:
程序代码:
#include <stdio.h>
void strcpy1(char *q[], char *p[], int n)
{
    int i;
    int j, m;
    for (i = 0; i<n; i++)
        for (m = 0; m<100 && *(p[i] + m); m++)
            *(q[i] + m) = *(p[i] + m);
    for (j = 0; j<n; j++)
        printf("%s ", q[j]);
}
int main(void)
{
    char *p[5] = { "asdg", "uewnngn", "sngn", "fhh", "mngkkd" };
    char *q[5] = {"qqqq","wwwwwww","eeee","iii","yyyyyy"};
    strcpy1(q, p, 5);
    return 0;
}
2 回复
#2
fulltimelink2020-05-11 14:26

因为q在常量存储区,不是堆栈存储区
#3
JabinZ2020-05-11 18:19
你的 p q 里面存的都是 地址(你写的那些字符串的地址), 而那些字符串实际所在的地方都是常量数据区域,这个区域的数据无法修改 。 这个问题你把p,q里面的内容用 地址形式输出你就会发现些规律

你如果想修改成功, q 要声明成容器
以下的代码,你在把 p q 的地址输出,看看和之前有什么不同
程序代码:

#include <stdio.h>
void strcpy1(char q[][10], char *p[], int n)
{
    int i;
    int j, m;
    for (i = 0; i<n; i++)
        for (m = 0; m<100 && *(p[i] + m); m++)
            *(q[i] + m) = *(p[i] + m);
    for (j = 0; j<n; j++)
        printf("%s ", q[j]);
}
int main(void)
{
    char *p[5] = { "asdg", "uewnngn", "sngn", "fhh", "mngkkd" };
    char q[5][10] = {"qqqq","wwwwwww","eeee","iii","yyyyyy"};
    strcpy1(q, p, 5);
   
    printf("\n&p => %p, &q => %p\n", &p, &q);
    printf("&(p[0]) => %p, &(q[0]) => %p\n", &(p[0]), &(q[0]));
    printf("&(p[1]) => %p, &(q[1]) => %p\n", &(p[1]), &(q[1]));
    printf("p[1] => %p, q[1] => %p\n", p[1], q[1]);
    printf("p[1] = %s, q[1] = %s\n", p[1], q[1]);
    return 0;
}
1