簡體   English   中英

使用 strcpy() 為結構賦值。 程序不運行

[英]Using strcpy() to assign values to a struct. Program doesnt run

我是 c 的新手,我正在嘗試使用 strcpy 為結構賦值(我嘗試使用左值方法使用賦值並引發錯誤)。 我嘗試運行該程序,但沒有任何反應。 我的代碼中的錯誤在哪里? 我正在使用代碼塊來運行程序。

#include <stdio.h>
#include <stdlib.h>

int main(){
    struct student{
        char name[25];
        int age;
    };
    struct student s1;
    strcpy(s1.name, "Sammy");
    strcpy(s1.age, "18");
    printf("%s, %d", s1.name, s1.age);
}

程序不運行

刪除這個:

strcpy(s1.age, "18");

你可以正常賦值。 s1.age = 18;

首先要做的是閱讀來自編譯器的警告,因為它們包含有關代碼問題的寶貴信息。 使用 gcc 和 clang 編譯原始代碼會給出以下警告:

鐺:

so5.c:12:12: 警告:不兼容的整數到指針轉換將“int”傳遞給“char *”類型的參數 [-Wint-conversion]

海灣合作委員會:

so5.c:12:12: 警告:傳遞參數 1 的 'strcpy' 使指針從整數而不進行強制轉換 [-Wint-conversion] strcpy(s1.age, "18");

所以違規行是:

strcpy(s1.age, "18");

首先將未初始化的 s1.age 視為指針並嘗試將字符串復制到這個未知位置。 這很可能會導致分段錯誤。

你當然可以制作一個指針並用"18"填充它的內存內容

strcpy(&s1.age, "18");

但是等待這會導致打印如下:

薩米,14385

因為字符串是用ascii編碼的,三個字節0x31,0x38,0

當寫入int age字段的位置時為0x003831或十進制14385 然而,這純粹是運氣,鉸孔字節被隨機初始化為 0。

為年齡賦值的正確方法是賦值:

s1.age = 18;

strcpy()用於將字符串復制到字符緩沖區。 strcpy(s1.age, "18"); ,您正在嘗試從字符串18的地址讀取某些內容並將其寫入s1.age ,這是一個int

要么將age成員聲明為char數組,就像您對name所做的那樣(盡管這會限制您對age進行算術運算)。 或者,使用賦值運算符=分配一個int 比如: s1.age = 18;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM